diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-03-15 13:35:56 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-03-15 13:35:56 +0300 |
commit | 094638589de6a6c9f91fad0005843fc1c1adc957 (patch) | |
tree | 7d55b9e950eb724da222548997547bf6710b1b58 /contrib/libs/openssl/apps | |
parent | bc921e787bed8a51a43725b78382e806800c44c1 (diff) | |
download | ydb-094638589de6a6c9f91fad0005843fc1c1adc957.tar.gz |
intermediate changes
ref:ca7a95e8c9a9d780f96497136a152091d54e61b5
Diffstat (limited to 'contrib/libs/openssl/apps')
67 files changed, 0 insertions, 45677 deletions
diff --git a/contrib/libs/openssl/apps/.yandex_meta/licenses.list.txt b/contrib/libs/openssl/apps/.yandex_meta/licenses.list.txt deleted file mode 100644 index cbb0974506..0000000000 --- a/contrib/libs/openssl/apps/.yandex_meta/licenses.list.txt +++ /dev/null @@ -1,257 +0,0 @@ -====================COPYRIGHT==================== - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved - - -====================COPYRIGHT==================== - * Copyright (c) 2004, EdelKey Project. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright (c) 2013-2014 Timo Teräs <timo.teras@gmail.com> - - -====================COPYRIGHT==================== - * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1998-2017 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2004-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2005 Nokia. All rights reserved. - - -====================COPYRIGHT==================== - * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2008-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2016 VMS Software, Inc. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. - - -====================COPYRIGHT==================== - * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. - - -====================File: LICENSE==================== - - LICENSE ISSUES - ============== - - The OpenSSL toolkit stays under a double license, i.e. both the conditions of - the OpenSSL License and the original SSLeay license apply to the toolkit. - See below for the actual license texts. - - OpenSSL License - --------------- - -/* ==================================================================== - * Copyright (c) 1998-2019 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 - * 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 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). - * - */ - - Original SSLeay License - ----------------------- - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * 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. - * - * 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). - * - * 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. - * - * 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 :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * 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. - * - * 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.] - */ - - - -====================OpenSSL==================== - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - - -====================Public-Domain==================== - * (note that it's in the public domain) diff --git a/contrib/libs/openssl/apps/app_rand.c b/contrib/libs/openssl/apps/app_rand.c deleted file mode 100644 index 2b0bbde034..0000000000 --- a/contrib/libs/openssl/apps/app_rand.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "apps.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/rand.h> -#include <openssl/conf.h> - -static char *save_rand_file; - -void app_RAND_load_conf(CONF *c, const char *section) -{ - const char *randfile = NCONF_get_string(c, section, "RANDFILE"); - - if (randfile == NULL) { - ERR_clear_error(); - return; - } - if (RAND_load_file(randfile, -1) < 0) { - BIO_printf(bio_err, "Can't load %s into RNG\n", randfile); - ERR_print_errors(bio_err); - } - if (save_rand_file == NULL) - save_rand_file = OPENSSL_strdup(randfile); -} - -static int loadfiles(char *name) -{ - char *p; - int last, ret = 1; - - for ( ; ; ) { - last = 0; - for (p = name; *p != '\0' && *p != LIST_SEPARATOR_CHAR; p++) - continue; - if (*p == '\0') - last = 1; - *p = '\0'; - if (RAND_load_file(name, -1) < 0) { - BIO_printf(bio_err, "Can't load %s into RNG\n", name); - ERR_print_errors(bio_err); - ret = 0; - } - if (last) - break; - name = p + 1; - if (*name == '\0') - break; - } - return ret; -} - -void app_RAND_write(void) -{ - if (save_rand_file == NULL) - return; - if (RAND_write_file(save_rand_file) == -1) { - BIO_printf(bio_err, "Cannot write random bytes:\n"); - ERR_print_errors(bio_err); - } - OPENSSL_free(save_rand_file); - save_rand_file = NULL; -} - - -/* - * See comments in opt_verify for explanation of this. - */ -enum r_range { OPT_R_ENUM }; - -int opt_rand(int opt) -{ - switch ((enum r_range)opt) { - case OPT_R__FIRST: - case OPT_R__LAST: - break; - case OPT_R_RAND: - return loadfiles(opt_arg()); - break; - case OPT_R_WRITERAND: - OPENSSL_free(save_rand_file); - save_rand_file = OPENSSL_strdup(opt_arg()); - break; - } - return 1; -} diff --git a/contrib/libs/openssl/apps/apps.c b/contrib/libs/openssl/apps/apps.c deleted file mode 100644 index c06241abb9..0000000000 --- a/contrib/libs/openssl/apps/apps.c +++ /dev/null @@ -1,2779 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS) -/* - * On VMS, you need to define this to get the declaration of fileno(). The - * value 2 is to make sure no function defined in POSIX-2 is left undefined. - */ -# define _POSIX_C_SOURCE 2 -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#ifndef OPENSSL_NO_POSIX_IO -# include <sys/stat.h> -# include <fcntl.h> -#endif -#include <ctype.h> -#include <errno.h> -#include <openssl/err.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/pem.h> -#include <openssl/pkcs12.h> -#include <openssl/ui.h> -#include <openssl/safestack.h> -#ifndef OPENSSL_NO_ENGINE -# include <openssl/engine.h> -#endif -#ifndef OPENSSL_NO_RSA -# include <openssl/rsa.h> -#endif -#include <openssl/bn.h> -#include <openssl/ssl.h> -#include "apps.h" - -#ifdef _WIN32 -static int WIN32_rename(const char *from, const char *to); -# define rename(from,to) WIN32_rename((from),(to)) -#endif - -#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) -# include <conio.h> -#endif - -#if defined(OPENSSL_SYS_MSDOS) && !defined(_WIN32) -# define _kbhit kbhit -#endif - -typedef struct { - const char *name; - unsigned long flag; - unsigned long mask; -} NAME_EX_TBL; - -static UI_METHOD *ui_method = NULL; -static const UI_METHOD *ui_fallback_method = NULL; - -static int set_table_opts(unsigned long *flags, const char *arg, - const NAME_EX_TBL * in_tbl); -static int set_multi_opts(unsigned long *flags, const char *arg, - const NAME_EX_TBL * in_tbl); - -int app_init(long mesgwin); - -int chopup_args(ARGS *arg, char *buf) -{ - int quoted; - char c = '\0', *p = NULL; - - arg->argc = 0; - if (arg->size == 0) { - arg->size = 20; - arg->argv = app_malloc(sizeof(*arg->argv) * arg->size, "argv space"); - } - - for (p = buf;;) { - /* Skip whitespace. */ - while (*p && isspace(_UC(*p))) - p++; - if (!*p) - break; - - /* The start of something good :-) */ - if (arg->argc >= arg->size) { - char **tmp; - arg->size += 20; - tmp = OPENSSL_realloc(arg->argv, sizeof(*arg->argv) * arg->size); - if (tmp == NULL) - return 0; - arg->argv = tmp; - } - quoted = *p == '\'' || *p == '"'; - if (quoted) - c = *p++; - arg->argv[arg->argc++] = p; - - /* now look for the end of this */ - if (quoted) { - while (*p && *p != c) - p++; - *p++ = '\0'; - } else { - while (*p && !isspace(_UC(*p))) - p++; - if (*p) - *p++ = '\0'; - } - } - arg->argv[arg->argc] = NULL; - return 1; -} - -#ifndef APP_INIT -int app_init(long mesgwin) -{ - return 1; -} -#endif - -int ctx_set_verify_locations(SSL_CTX *ctx, const char *CAfile, - const char *CApath, int noCAfile, int noCApath) -{ - if (CAfile == NULL && CApath == NULL) { - if (!noCAfile && SSL_CTX_set_default_verify_file(ctx) <= 0) - return 0; - if (!noCApath && SSL_CTX_set_default_verify_dir(ctx) <= 0) - return 0; - - return 1; - } - return SSL_CTX_load_verify_locations(ctx, CAfile, CApath); -} - -#ifndef OPENSSL_NO_CT - -int ctx_set_ctlog_list_file(SSL_CTX *ctx, const char *path) -{ - if (path == NULL) - return SSL_CTX_set_default_ctlog_list_file(ctx); - - return SSL_CTX_set_ctlog_list_file(ctx, path); -} - -#endif - -static unsigned long nmflag = 0; -static char nmflag_set = 0; - -int set_nameopt(const char *arg) -{ - int ret = set_name_ex(&nmflag, arg); - - if (ret) - nmflag_set = 1; - - return ret; -} - -unsigned long get_nameopt(void) -{ - return (nmflag_set) ? nmflag : XN_FLAG_ONELINE; -} - -int dump_cert_text(BIO *out, X509 *x) -{ - print_name(out, "subject=", X509_get_subject_name(x), get_nameopt()); - BIO_puts(out, "\n"); - print_name(out, "issuer=", X509_get_issuer_name(x), get_nameopt()); - BIO_puts(out, "\n"); - - return 0; -} - -static int ui_open(UI *ui) -{ - int (*opener)(UI *ui) = UI_method_get_opener(ui_fallback_method); - - if (opener) - return opener(ui); - return 1; -} - -static int ui_read(UI *ui, UI_STRING *uis) -{ - int (*reader)(UI *ui, UI_STRING *uis) = NULL; - - if (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD - && UI_get0_user_data(ui)) { - switch (UI_get_string_type(uis)) { - case UIT_PROMPT: - case UIT_VERIFY: - { - const char *password = - ((PW_CB_DATA *)UI_get0_user_data(ui))->password; - if (password && password[0] != '\0') { - UI_set_result(ui, uis, password); - return 1; - } - } - break; - case UIT_NONE: - case UIT_BOOLEAN: - case UIT_INFO: - case UIT_ERROR: - break; - } - } - - reader = UI_method_get_reader(ui_fallback_method); - if (reader) - return reader(ui, uis); - return 1; -} - -static int ui_write(UI *ui, UI_STRING *uis) -{ - int (*writer)(UI *ui, UI_STRING *uis) = NULL; - - if (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD - && UI_get0_user_data(ui)) { - switch (UI_get_string_type(uis)) { - case UIT_PROMPT: - case UIT_VERIFY: - { - const char *password = - ((PW_CB_DATA *)UI_get0_user_data(ui))->password; - if (password && password[0] != '\0') - return 1; - } - break; - case UIT_NONE: - case UIT_BOOLEAN: - case UIT_INFO: - case UIT_ERROR: - break; - } - } - - writer = UI_method_get_writer(ui_fallback_method); - if (writer) - return writer(ui, uis); - return 1; -} - -static int ui_close(UI *ui) -{ - int (*closer)(UI *ui) = UI_method_get_closer(ui_fallback_method); - - if (closer) - return closer(ui); - return 1; -} - -int setup_ui_method(void) -{ - ui_fallback_method = UI_null(); -#ifndef OPENSSL_NO_UI_CONSOLE - ui_fallback_method = UI_OpenSSL(); -#endif - ui_method = UI_create_method("OpenSSL application user interface"); - UI_method_set_opener(ui_method, ui_open); - UI_method_set_reader(ui_method, ui_read); - UI_method_set_writer(ui_method, ui_write); - UI_method_set_closer(ui_method, ui_close); - return 0; -} - -void destroy_ui_method(void) -{ - if (ui_method) { - UI_destroy_method(ui_method); - ui_method = NULL; - } -} - -const UI_METHOD *get_ui_method(void) -{ - return ui_method; -} - -int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp) -{ - int res = 0; - UI *ui = NULL; - PW_CB_DATA *cb_data = (PW_CB_DATA *)cb_tmp; - - ui = UI_new_method(ui_method); - if (ui) { - int ok = 0; - char *buff = NULL; - int ui_flags = 0; - const char *prompt_info = NULL; - char *prompt; - - if (cb_data != NULL && cb_data->prompt_info != NULL) - prompt_info = cb_data->prompt_info; - prompt = UI_construct_prompt(ui, "pass phrase", prompt_info); - if (!prompt) { - BIO_printf(bio_err, "Out of memory\n"); - UI_free(ui); - return 0; - } - - ui_flags |= UI_INPUT_FLAG_DEFAULT_PWD; - UI_ctrl(ui, UI_CTRL_PRINT_ERRORS, 1, 0, 0); - - /* We know that there is no previous user data to return to us */ - (void)UI_add_user_data(ui, cb_data); - - ok = UI_add_input_string(ui, prompt, ui_flags, buf, - PW_MIN_LENGTH, bufsiz - 1); - - if (ok >= 0 && verify) { - buff = app_malloc(bufsiz, "password buffer"); - ok = UI_add_verify_string(ui, prompt, ui_flags, buff, - PW_MIN_LENGTH, bufsiz - 1, buf); - } - if (ok >= 0) - do { - ok = UI_process(ui); - } while (ok < 0 && UI_ctrl(ui, UI_CTRL_IS_REDOABLE, 0, 0, 0)); - - OPENSSL_clear_free(buff, (unsigned int)bufsiz); - - if (ok >= 0) - res = strlen(buf); - if (ok == -1) { - BIO_printf(bio_err, "User interface error\n"); - ERR_print_errors(bio_err); - OPENSSL_cleanse(buf, (unsigned int)bufsiz); - res = 0; - } - if (ok == -2) { - BIO_printf(bio_err, "aborted!\n"); - OPENSSL_cleanse(buf, (unsigned int)bufsiz); - res = 0; - } - UI_free(ui); - OPENSSL_free(prompt); - } - return res; -} - -static char *app_get_pass(const char *arg, int keepbio); - -int app_passwd(const char *arg1, const char *arg2, char **pass1, char **pass2) -{ - int same; - if (arg2 == NULL || arg1 == NULL || strcmp(arg1, arg2)) - same = 0; - else - same = 1; - if (arg1 != NULL) { - *pass1 = app_get_pass(arg1, same); - if (*pass1 == NULL) - return 0; - } else if (pass1 != NULL) { - *pass1 = NULL; - } - if (arg2 != NULL) { - *pass2 = app_get_pass(arg2, same ? 2 : 0); - if (*pass2 == NULL) - return 0; - } else if (pass2 != NULL) { - *pass2 = NULL; - } - return 1; -} - -static char *app_get_pass(const char *arg, int keepbio) -{ - char *tmp, tpass[APP_PASS_LEN]; - static BIO *pwdbio = NULL; - int i; - - if (strncmp(arg, "pass:", 5) == 0) - return OPENSSL_strdup(arg + 5); - if (strncmp(arg, "env:", 4) == 0) { - tmp = getenv(arg + 4); - if (tmp == NULL) { - BIO_printf(bio_err, "Can't read environment variable %s\n", arg + 4); - return NULL; - } - return OPENSSL_strdup(tmp); - } - if (!keepbio || pwdbio == NULL) { - if (strncmp(arg, "file:", 5) == 0) { - pwdbio = BIO_new_file(arg + 5, "r"); - if (pwdbio == NULL) { - BIO_printf(bio_err, "Can't open file %s\n", arg + 5); - return NULL; - } -#if !defined(_WIN32) - /* - * Under _WIN32, which covers even Win64 and CE, file - * descriptors referenced by BIO_s_fd are not inherited - * by child process and therefore below is not an option. - * It could have been an option if bss_fd.c was operating - * on real Windows descriptors, such as those obtained - * with CreateFile. - */ - } else if (strncmp(arg, "fd:", 3) == 0) { - BIO *btmp; - i = atoi(arg + 3); - if (i >= 0) - pwdbio = BIO_new_fd(i, BIO_NOCLOSE); - if ((i < 0) || !pwdbio) { - BIO_printf(bio_err, "Can't access file descriptor %s\n", arg + 3); - return NULL; - } - /* - * Can't do BIO_gets on an fd BIO so add a buffering BIO - */ - btmp = BIO_new(BIO_f_buffer()); - pwdbio = BIO_push(btmp, pwdbio); -#endif - } else if (strcmp(arg, "stdin") == 0) { - pwdbio = dup_bio_in(FORMAT_TEXT); - if (!pwdbio) { - BIO_printf(bio_err, "Can't open BIO for stdin\n"); - return NULL; - } - } else { - BIO_printf(bio_err, "Invalid password argument \"%s\"\n", arg); - return NULL; - } - } - i = BIO_gets(pwdbio, tpass, APP_PASS_LEN); - if (keepbio != 1) { - BIO_free_all(pwdbio); - pwdbio = NULL; - } - if (i <= 0) { - BIO_printf(bio_err, "Error reading password from BIO\n"); - return NULL; - } - tmp = strchr(tpass, '\n'); - if (tmp != NULL) - *tmp = 0; - return OPENSSL_strdup(tpass); -} - -CONF *app_load_config_bio(BIO *in, const char *filename) -{ - long errorline = -1; - CONF *conf; - int i; - - conf = NCONF_new(NULL); - i = NCONF_load_bio(conf, in, &errorline); - if (i > 0) - return conf; - - if (errorline <= 0) { - BIO_printf(bio_err, "%s: Can't load ", opt_getprog()); - } else { - BIO_printf(bio_err, "%s: Error on line %ld of ", opt_getprog(), - errorline); - } - if (filename != NULL) - BIO_printf(bio_err, "config file \"%s\"\n", filename); - else - BIO_printf(bio_err, "config input"); - - NCONF_free(conf); - return NULL; -} - -CONF *app_load_config(const char *filename) -{ - BIO *in; - CONF *conf; - - in = bio_open_default(filename, 'r', FORMAT_TEXT); - if (in == NULL) - return NULL; - - conf = app_load_config_bio(in, filename); - BIO_free(in); - return conf; -} - -CONF *app_load_config_quiet(const char *filename) -{ - BIO *in; - CONF *conf; - - in = bio_open_default_quiet(filename, 'r', FORMAT_TEXT); - if (in == NULL) - return NULL; - - conf = app_load_config_bio(in, filename); - BIO_free(in); - return conf; -} - -int app_load_modules(const CONF *config) -{ - CONF *to_free = NULL; - - if (config == NULL) - config = to_free = app_load_config_quiet(default_config_file); - if (config == NULL) - return 1; - - if (CONF_modules_load(config, NULL, 0) <= 0) { - BIO_printf(bio_err, "Error configuring OpenSSL modules\n"); - ERR_print_errors(bio_err); - NCONF_free(to_free); - return 0; - } - NCONF_free(to_free); - return 1; -} - -int add_oid_section(CONF *conf) -{ - char *p; - STACK_OF(CONF_VALUE) *sktmp; - CONF_VALUE *cnf; - int i; - - if ((p = NCONF_get_string(conf, NULL, "oid_section")) == NULL) { - ERR_clear_error(); - return 1; - } - if ((sktmp = NCONF_get_section(conf, p)) == NULL) { - BIO_printf(bio_err, "problem loading oid section %s\n", p); - return 0; - } - for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) { - cnf = sk_CONF_VALUE_value(sktmp, i); - if (OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) { - BIO_printf(bio_err, "problem creating object %s=%s\n", - cnf->name, cnf->value); - return 0; - } - } - return 1; -} - -static int load_pkcs12(BIO *in, const char *desc, - pem_password_cb *pem_cb, void *cb_data, - EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca) -{ - const char *pass; - char tpass[PEM_BUFSIZE]; - int len, ret = 0; - PKCS12 *p12; - p12 = d2i_PKCS12_bio(in, NULL); - if (p12 == NULL) { - BIO_printf(bio_err, "Error loading PKCS12 file for %s\n", desc); - goto die; - } - /* See if an empty password will do */ - if (PKCS12_verify_mac(p12, "", 0) || PKCS12_verify_mac(p12, NULL, 0)) { - pass = ""; - } else { - if (!pem_cb) - pem_cb = (pem_password_cb *)password_callback; - len = pem_cb(tpass, PEM_BUFSIZE, 0, cb_data); - if (len < 0) { - BIO_printf(bio_err, "Passphrase callback error for %s\n", desc); - goto die; - } - if (len < PEM_BUFSIZE) - tpass[len] = 0; - if (!PKCS12_verify_mac(p12, tpass, len)) { - BIO_printf(bio_err, - "Mac verify error (wrong password?) in PKCS12 file for %s\n", - desc); - goto die; - } - pass = tpass; - } - ret = PKCS12_parse(p12, pass, pkey, cert, ca); - die: - PKCS12_free(p12); - return ret; -} - -#if !defined(OPENSSL_NO_OCSP) && !defined(OPENSSL_NO_SOCK) -static int load_cert_crl_http(const char *url, X509 **pcert, X509_CRL **pcrl) -{ - char *host = NULL, *port = NULL, *path = NULL; - BIO *bio = NULL; - OCSP_REQ_CTX *rctx = NULL; - int use_ssl, rv = 0; - if (!OCSP_parse_url(url, &host, &port, &path, &use_ssl)) - goto err; - if (use_ssl) { - BIO_puts(bio_err, "https not supported\n"); - goto err; - } - bio = BIO_new_connect(host); - if (!bio || !BIO_set_conn_port(bio, port)) - goto err; - rctx = OCSP_REQ_CTX_new(bio, 1024); - if (rctx == NULL) - goto err; - if (!OCSP_REQ_CTX_http(rctx, "GET", path)) - goto err; - if (!OCSP_REQ_CTX_add1_header(rctx, "Host", host)) - goto err; - if (pcert) { - do { - rv = X509_http_nbio(rctx, pcert); - } while (rv == -1); - } else { - do { - rv = X509_CRL_http_nbio(rctx, pcrl); - } while (rv == -1); - } - - err: - OPENSSL_free(host); - OPENSSL_free(path); - OPENSSL_free(port); - BIO_free_all(bio); - OCSP_REQ_CTX_free(rctx); - if (rv != 1) { - BIO_printf(bio_err, "Error loading %s from %s\n", - pcert ? "certificate" : "CRL", url); - ERR_print_errors(bio_err); - } - return rv; -} -#endif - -X509 *load_cert(const char *file, int format, const char *cert_descrip) -{ - X509 *x = NULL; - BIO *cert; - - if (format == FORMAT_HTTP) { -#if !defined(OPENSSL_NO_OCSP) && !defined(OPENSSL_NO_SOCK) - load_cert_crl_http(file, &x, NULL); -#endif - return x; - } - - if (file == NULL) { - unbuffer(stdin); - cert = dup_bio_in(format); - } else { - cert = bio_open_default(file, 'r', format); - } - if (cert == NULL) - goto end; - - if (format == FORMAT_ASN1) { - x = d2i_X509_bio(cert, NULL); - } else if (format == FORMAT_PEM) { - x = PEM_read_bio_X509_AUX(cert, NULL, - (pem_password_cb *)password_callback, NULL); - } else if (format == FORMAT_PKCS12) { - if (!load_pkcs12(cert, cert_descrip, NULL, NULL, NULL, &x, NULL)) - goto end; - } else { - BIO_printf(bio_err, "bad input format specified for %s\n", cert_descrip); - goto end; - } - end: - if (x == NULL) { - BIO_printf(bio_err, "unable to load certificate\n"); - ERR_print_errors(bio_err); - } - BIO_free(cert); - return x; -} - -X509_CRL *load_crl(const char *infile, int format) -{ - X509_CRL *x = NULL; - BIO *in = NULL; - - if (format == FORMAT_HTTP) { -#if !defined(OPENSSL_NO_OCSP) && !defined(OPENSSL_NO_SOCK) - load_cert_crl_http(infile, NULL, &x); -#endif - return x; - } - - in = bio_open_default(infile, 'r', format); - if (in == NULL) - goto end; - if (format == FORMAT_ASN1) { - x = d2i_X509_CRL_bio(in, NULL); - } else if (format == FORMAT_PEM) { - x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL); - } else { - BIO_printf(bio_err, "bad input format specified for input crl\n"); - goto end; - } - if (x == NULL) { - BIO_printf(bio_err, "unable to load CRL\n"); - ERR_print_errors(bio_err); - goto end; - } - - end: - BIO_free(in); - return x; -} - -EVP_PKEY *load_key(const char *file, int format, int maybe_stdin, - const char *pass, ENGINE *e, const char *key_descrip) -{ - BIO *key = NULL; - EVP_PKEY *pkey = NULL; - PW_CB_DATA cb_data; - - cb_data.password = pass; - cb_data.prompt_info = file; - - if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE)) { - BIO_printf(bio_err, "no keyfile specified\n"); - goto end; - } - if (format == FORMAT_ENGINE) { - if (e == NULL) { - BIO_printf(bio_err, "no engine specified\n"); - } else { -#ifndef OPENSSL_NO_ENGINE - if (ENGINE_init(e)) { - pkey = ENGINE_load_private_key(e, file, ui_method, &cb_data); - ENGINE_finish(e); - } - if (pkey == NULL) { - BIO_printf(bio_err, "cannot load %s from engine\n", key_descrip); - ERR_print_errors(bio_err); - } -#else - BIO_printf(bio_err, "engines not supported\n"); -#endif - } - goto end; - } - if (file == NULL && maybe_stdin) { - unbuffer(stdin); - key = dup_bio_in(format); - } else { - key = bio_open_default(file, 'r', format); - } - if (key == NULL) - goto end; - if (format == FORMAT_ASN1) { - pkey = d2i_PrivateKey_bio(key, NULL); - } else if (format == FORMAT_PEM) { - pkey = PEM_read_bio_PrivateKey(key, NULL, - (pem_password_cb *)password_callback, - &cb_data); - } else if (format == FORMAT_PKCS12) { - if (!load_pkcs12(key, key_descrip, - (pem_password_cb *)password_callback, &cb_data, - &pkey, NULL, NULL)) - goto end; -#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) && !defined (OPENSSL_NO_RC4) - } else if (format == FORMAT_MSBLOB) { - pkey = b2i_PrivateKey_bio(key); - } else if (format == FORMAT_PVK) { - pkey = b2i_PVK_bio(key, (pem_password_cb *)password_callback, - &cb_data); -#endif - } else { - BIO_printf(bio_err, "bad input format specified for key file\n"); - goto end; - } - end: - BIO_free(key); - if (pkey == NULL) { - BIO_printf(bio_err, "unable to load %s\n", key_descrip); - ERR_print_errors(bio_err); - } - return pkey; -} - -EVP_PKEY *load_pubkey(const char *file, int format, int maybe_stdin, - const char *pass, ENGINE *e, const char *key_descrip) -{ - BIO *key = NULL; - EVP_PKEY *pkey = NULL; - PW_CB_DATA cb_data; - - cb_data.password = pass; - cb_data.prompt_info = file; - - if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE)) { - BIO_printf(bio_err, "no keyfile specified\n"); - goto end; - } - if (format == FORMAT_ENGINE) { - if (e == NULL) { - BIO_printf(bio_err, "no engine specified\n"); - } else { -#ifndef OPENSSL_NO_ENGINE - pkey = ENGINE_load_public_key(e, file, ui_method, &cb_data); - if (pkey == NULL) { - BIO_printf(bio_err, "cannot load %s from engine\n", key_descrip); - ERR_print_errors(bio_err); - } -#else - BIO_printf(bio_err, "engines not supported\n"); -#endif - } - goto end; - } - if (file == NULL && maybe_stdin) { - unbuffer(stdin); - key = dup_bio_in(format); - } else { - key = bio_open_default(file, 'r', format); - } - if (key == NULL) - goto end; - if (format == FORMAT_ASN1) { - pkey = d2i_PUBKEY_bio(key, NULL); - } else if (format == FORMAT_ASN1RSA) { -#ifndef OPENSSL_NO_RSA - RSA *rsa; - rsa = d2i_RSAPublicKey_bio(key, NULL); - if (rsa) { - pkey = EVP_PKEY_new(); - if (pkey != NULL) - EVP_PKEY_set1_RSA(pkey, rsa); - RSA_free(rsa); - } else -#else - BIO_printf(bio_err, "RSA keys not supported\n"); -#endif - pkey = NULL; - } else if (format == FORMAT_PEMRSA) { -#ifndef OPENSSL_NO_RSA - RSA *rsa; - rsa = PEM_read_bio_RSAPublicKey(key, NULL, - (pem_password_cb *)password_callback, - &cb_data); - if (rsa != NULL) { - pkey = EVP_PKEY_new(); - if (pkey != NULL) - EVP_PKEY_set1_RSA(pkey, rsa); - RSA_free(rsa); - } else -#else - BIO_printf(bio_err, "RSA keys not supported\n"); -#endif - pkey = NULL; - } else if (format == FORMAT_PEM) { - pkey = PEM_read_bio_PUBKEY(key, NULL, - (pem_password_cb *)password_callback, - &cb_data); -#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) - } else if (format == FORMAT_MSBLOB) { - pkey = b2i_PublicKey_bio(key); -#endif - } - end: - BIO_free(key); - if (pkey == NULL) - BIO_printf(bio_err, "unable to load %s\n", key_descrip); - return pkey; -} - -static int load_certs_crls(const char *file, int format, - const char *pass, const char *desc, - STACK_OF(X509) **pcerts, - STACK_OF(X509_CRL) **pcrls) -{ - int i; - BIO *bio; - STACK_OF(X509_INFO) *xis = NULL; - X509_INFO *xi; - PW_CB_DATA cb_data; - int rv = 0; - - cb_data.password = pass; - cb_data.prompt_info = file; - - if (format != FORMAT_PEM) { - BIO_printf(bio_err, "bad input format specified for %s\n", desc); - return 0; - } - - bio = bio_open_default(file, 'r', FORMAT_PEM); - if (bio == NULL) - return 0; - - xis = PEM_X509_INFO_read_bio(bio, NULL, - (pem_password_cb *)password_callback, - &cb_data); - - BIO_free(bio); - - if (pcerts != NULL && *pcerts == NULL) { - *pcerts = sk_X509_new_null(); - if (*pcerts == NULL) - goto end; - } - - if (pcrls != NULL && *pcrls == NULL) { - *pcrls = sk_X509_CRL_new_null(); - if (*pcrls == NULL) - goto end; - } - - for (i = 0; i < sk_X509_INFO_num(xis); i++) { - xi = sk_X509_INFO_value(xis, i); - if (xi->x509 != NULL && pcerts != NULL) { - if (!sk_X509_push(*pcerts, xi->x509)) - goto end; - xi->x509 = NULL; - } - if (xi->crl != NULL && pcrls != NULL) { - if (!sk_X509_CRL_push(*pcrls, xi->crl)) - goto end; - xi->crl = NULL; - } - } - - if (pcerts != NULL && sk_X509_num(*pcerts) > 0) - rv = 1; - - if (pcrls != NULL && sk_X509_CRL_num(*pcrls) > 0) - rv = 1; - - end: - - sk_X509_INFO_pop_free(xis, X509_INFO_free); - - if (rv == 0) { - if (pcerts != NULL) { - sk_X509_pop_free(*pcerts, X509_free); - *pcerts = NULL; - } - if (pcrls != NULL) { - sk_X509_CRL_pop_free(*pcrls, X509_CRL_free); - *pcrls = NULL; - } - BIO_printf(bio_err, "unable to load %s\n", - pcerts ? "certificates" : "CRLs"); - ERR_print_errors(bio_err); - } - return rv; -} - -void* app_malloc(int sz, const char *what) -{ - void *vp = OPENSSL_malloc(sz); - - if (vp == NULL) { - BIO_printf(bio_err, "%s: Could not allocate %d bytes for %s\n", - opt_getprog(), sz, what); - ERR_print_errors(bio_err); - exit(1); - } - return vp; -} - -/* - * Initialize or extend, if *certs != NULL, a certificate stack. - */ -int load_certs(const char *file, STACK_OF(X509) **certs, int format, - const char *pass, const char *desc) -{ - return load_certs_crls(file, format, pass, desc, certs, NULL); -} - -/* - * Initialize or extend, if *crls != NULL, a certificate stack. - */ -int load_crls(const char *file, STACK_OF(X509_CRL) **crls, int format, - const char *pass, const char *desc) -{ - return load_certs_crls(file, format, pass, desc, NULL, crls); -} - -#define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) -/* Return error for unknown extensions */ -#define X509V3_EXT_DEFAULT 0 -/* Print error for unknown extensions */ -#define X509V3_EXT_ERROR_UNKNOWN (1L << 16) -/* ASN1 parse unknown extensions */ -#define X509V3_EXT_PARSE_UNKNOWN (2L << 16) -/* BIO_dump unknown extensions */ -#define X509V3_EXT_DUMP_UNKNOWN (3L << 16) - -#define X509_FLAG_CA (X509_FLAG_NO_ISSUER | X509_FLAG_NO_PUBKEY | \ - X509_FLAG_NO_HEADER | X509_FLAG_NO_VERSION) - -int set_cert_ex(unsigned long *flags, const char *arg) -{ - static const NAME_EX_TBL cert_tbl[] = { - {"compatible", X509_FLAG_COMPAT, 0xffffffffl}, - {"ca_default", X509_FLAG_CA, 0xffffffffl}, - {"no_header", X509_FLAG_NO_HEADER, 0}, - {"no_version", X509_FLAG_NO_VERSION, 0}, - {"no_serial", X509_FLAG_NO_SERIAL, 0}, - {"no_signame", X509_FLAG_NO_SIGNAME, 0}, - {"no_validity", X509_FLAG_NO_VALIDITY, 0}, - {"no_subject", X509_FLAG_NO_SUBJECT, 0}, - {"no_issuer", X509_FLAG_NO_ISSUER, 0}, - {"no_pubkey", X509_FLAG_NO_PUBKEY, 0}, - {"no_extensions", X509_FLAG_NO_EXTENSIONS, 0}, - {"no_sigdump", X509_FLAG_NO_SIGDUMP, 0}, - {"no_aux", X509_FLAG_NO_AUX, 0}, - {"no_attributes", X509_FLAG_NO_ATTRIBUTES, 0}, - {"ext_default", X509V3_EXT_DEFAULT, X509V3_EXT_UNKNOWN_MASK}, - {"ext_error", X509V3_EXT_ERROR_UNKNOWN, X509V3_EXT_UNKNOWN_MASK}, - {"ext_parse", X509V3_EXT_PARSE_UNKNOWN, X509V3_EXT_UNKNOWN_MASK}, - {"ext_dump", X509V3_EXT_DUMP_UNKNOWN, X509V3_EXT_UNKNOWN_MASK}, - {NULL, 0, 0} - }; - return set_multi_opts(flags, arg, cert_tbl); -} - -int set_name_ex(unsigned long *flags, const char *arg) -{ - static const NAME_EX_TBL ex_tbl[] = { - {"esc_2253", ASN1_STRFLGS_ESC_2253, 0}, - {"esc_2254", ASN1_STRFLGS_ESC_2254, 0}, - {"esc_ctrl", ASN1_STRFLGS_ESC_CTRL, 0}, - {"esc_msb", ASN1_STRFLGS_ESC_MSB, 0}, - {"use_quote", ASN1_STRFLGS_ESC_QUOTE, 0}, - {"utf8", ASN1_STRFLGS_UTF8_CONVERT, 0}, - {"ignore_type", ASN1_STRFLGS_IGNORE_TYPE, 0}, - {"show_type", ASN1_STRFLGS_SHOW_TYPE, 0}, - {"dump_all", ASN1_STRFLGS_DUMP_ALL, 0}, - {"dump_nostr", ASN1_STRFLGS_DUMP_UNKNOWN, 0}, - {"dump_der", ASN1_STRFLGS_DUMP_DER, 0}, - {"compat", XN_FLAG_COMPAT, 0xffffffffL}, - {"sep_comma_plus", XN_FLAG_SEP_COMMA_PLUS, XN_FLAG_SEP_MASK}, - {"sep_comma_plus_space", XN_FLAG_SEP_CPLUS_SPC, XN_FLAG_SEP_MASK}, - {"sep_semi_plus_space", XN_FLAG_SEP_SPLUS_SPC, XN_FLAG_SEP_MASK}, - {"sep_multiline", XN_FLAG_SEP_MULTILINE, XN_FLAG_SEP_MASK}, - {"dn_rev", XN_FLAG_DN_REV, 0}, - {"nofname", XN_FLAG_FN_NONE, XN_FLAG_FN_MASK}, - {"sname", XN_FLAG_FN_SN, XN_FLAG_FN_MASK}, - {"lname", XN_FLAG_FN_LN, XN_FLAG_FN_MASK}, - {"align", XN_FLAG_FN_ALIGN, 0}, - {"oid", XN_FLAG_FN_OID, XN_FLAG_FN_MASK}, - {"space_eq", XN_FLAG_SPC_EQ, 0}, - {"dump_unknown", XN_FLAG_DUMP_UNKNOWN_FIELDS, 0}, - {"RFC2253", XN_FLAG_RFC2253, 0xffffffffL}, - {"oneline", XN_FLAG_ONELINE, 0xffffffffL}, - {"multiline", XN_FLAG_MULTILINE, 0xffffffffL}, - {"ca_default", XN_FLAG_MULTILINE, 0xffffffffL}, - {NULL, 0, 0} - }; - if (set_multi_opts(flags, arg, ex_tbl) == 0) - return 0; - if (*flags != XN_FLAG_COMPAT - && (*flags & XN_FLAG_SEP_MASK) == 0) - *flags |= XN_FLAG_SEP_CPLUS_SPC; - return 1; -} - -int set_ext_copy(int *copy_type, const char *arg) -{ - if (strcasecmp(arg, "none") == 0) - *copy_type = EXT_COPY_NONE; - else if (strcasecmp(arg, "copy") == 0) - *copy_type = EXT_COPY_ADD; - else if (strcasecmp(arg, "copyall") == 0) - *copy_type = EXT_COPY_ALL; - else - return 0; - return 1; -} - -int copy_extensions(X509 *x, X509_REQ *req, int copy_type) -{ - STACK_OF(X509_EXTENSION) *exts = NULL; - X509_EXTENSION *ext, *tmpext; - ASN1_OBJECT *obj; - int i, idx, ret = 0; - if (!x || !req || (copy_type == EXT_COPY_NONE)) - return 1; - exts = X509_REQ_get_extensions(req); - - for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) { - ext = sk_X509_EXTENSION_value(exts, i); - obj = X509_EXTENSION_get_object(ext); - idx = X509_get_ext_by_OBJ(x, obj, -1); - /* Does extension exist? */ - if (idx != -1) { - /* If normal copy don't override existing extension */ - if (copy_type == EXT_COPY_ADD) - continue; - /* Delete all extensions of same type */ - do { - tmpext = X509_get_ext(x, idx); - X509_delete_ext(x, idx); - X509_EXTENSION_free(tmpext); - idx = X509_get_ext_by_OBJ(x, obj, -1); - } while (idx != -1); - } - if (!X509_add_ext(x, ext, -1)) - goto end; - } - - ret = 1; - - end: - - sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); - - return ret; -} - -static int set_multi_opts(unsigned long *flags, const char *arg, - const NAME_EX_TBL * in_tbl) -{ - STACK_OF(CONF_VALUE) *vals; - CONF_VALUE *val; - int i, ret = 1; - if (!arg) - return 0; - vals = X509V3_parse_list(arg); - for (i = 0; i < sk_CONF_VALUE_num(vals); i++) { - val = sk_CONF_VALUE_value(vals, i); - if (!set_table_opts(flags, val->name, in_tbl)) - ret = 0; - } - sk_CONF_VALUE_pop_free(vals, X509V3_conf_free); - return ret; -} - -static int set_table_opts(unsigned long *flags, const char *arg, - const NAME_EX_TBL * in_tbl) -{ - char c; - const NAME_EX_TBL *ptbl; - c = arg[0]; - - if (c == '-') { - c = 0; - arg++; - } else if (c == '+') { - c = 1; - arg++; - } else { - c = 1; - } - - for (ptbl = in_tbl; ptbl->name; ptbl++) { - if (strcasecmp(arg, ptbl->name) == 0) { - *flags &= ~ptbl->mask; - if (c) - *flags |= ptbl->flag; - else - *flags &= ~ptbl->flag; - return 1; - } - } - return 0; -} - -void print_name(BIO *out, const char *title, X509_NAME *nm, - unsigned long lflags) -{ - char *buf; - char mline = 0; - int indent = 0; - - if (title) - BIO_puts(out, title); - if ((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) { - mline = 1; - indent = 4; - } - if (lflags == XN_FLAG_COMPAT) { - buf = X509_NAME_oneline(nm, 0, 0); - BIO_puts(out, buf); - BIO_puts(out, "\n"); - OPENSSL_free(buf); - } else { - if (mline) - BIO_puts(out, "\n"); - X509_NAME_print_ex(out, nm, indent, lflags); - BIO_puts(out, "\n"); - } -} - -void print_bignum_var(BIO *out, const BIGNUM *in, const char *var, - int len, unsigned char *buffer) -{ - BIO_printf(out, " static unsigned char %s_%d[] = {", var, len); - if (BN_is_zero(in)) { - BIO_printf(out, "\n 0x00"); - } else { - int i, l; - - l = BN_bn2bin(in, buffer); - for (i = 0; i < l; i++) { - BIO_printf(out, (i % 10) == 0 ? "\n " : " "); - if (i < l - 1) - BIO_printf(out, "0x%02X,", buffer[i]); - else - BIO_printf(out, "0x%02X", buffer[i]); - } - } - BIO_printf(out, "\n };\n"); -} - -void print_array(BIO *out, const char* title, int len, const unsigned char* d) -{ - int i; - - BIO_printf(out, "unsigned char %s[%d] = {", title, len); - for (i = 0; i < len; i++) { - if ((i % 10) == 0) - BIO_printf(out, "\n "); - if (i < len - 1) - BIO_printf(out, "0x%02X, ", d[i]); - else - BIO_printf(out, "0x%02X", d[i]); - } - BIO_printf(out, "\n};\n"); -} - -X509_STORE *setup_verify(const char *CAfile, const char *CApath, int noCAfile, int noCApath) -{ - X509_STORE *store = X509_STORE_new(); - X509_LOOKUP *lookup; - - if (store == NULL) - goto end; - - if (CAfile != NULL || !noCAfile) { - lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); - if (lookup == NULL) - goto end; - if (CAfile) { - if (!X509_LOOKUP_load_file(lookup, CAfile, X509_FILETYPE_PEM)) { - BIO_printf(bio_err, "Error loading file %s\n", CAfile); - goto end; - } - } else { - X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT); - } - } - - if (CApath != NULL || !noCApath) { - lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir()); - if (lookup == NULL) - goto end; - if (CApath) { - if (!X509_LOOKUP_add_dir(lookup, CApath, X509_FILETYPE_PEM)) { - BIO_printf(bio_err, "Error loading directory %s\n", CApath); - goto end; - } - } else { - X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT); - } - } - - ERR_clear_error(); - return store; - end: - X509_STORE_free(store); - return NULL; -} - -#ifndef OPENSSL_NO_ENGINE -/* Try to load an engine in a shareable library */ -static ENGINE *try_load_engine(const char *engine) -{ - ENGINE *e = ENGINE_by_id("dynamic"); - if (e) { - if (!ENGINE_ctrl_cmd_string(e, "SO_PATH", engine, 0) - || !ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0)) { - ENGINE_free(e); - e = NULL; - } - } - return e; -} -#endif - -ENGINE *setup_engine(const char *engine, int debug) -{ - ENGINE *e = NULL; - -#ifndef OPENSSL_NO_ENGINE - if (engine != NULL) { - if (strcmp(engine, "auto") == 0) { - BIO_printf(bio_err, "enabling auto ENGINE support\n"); - ENGINE_register_all_complete(); - return NULL; - } - if ((e = ENGINE_by_id(engine)) == NULL - && (e = try_load_engine(engine)) == NULL) { - BIO_printf(bio_err, "invalid engine \"%s\"\n", engine); - ERR_print_errors(bio_err); - return NULL; - } - if (debug) { - ENGINE_ctrl(e, ENGINE_CTRL_SET_LOGSTREAM, 0, bio_err, 0); - } - ENGINE_ctrl_cmd(e, "SET_USER_INTERFACE", 0, ui_method, 0, 1); - if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { - BIO_printf(bio_err, "can't use that engine\n"); - ERR_print_errors(bio_err); - ENGINE_free(e); - return NULL; - } - - BIO_printf(bio_err, "engine \"%s\" set.\n", ENGINE_get_id(e)); - } -#endif - return e; -} - -void release_engine(ENGINE *e) -{ -#ifndef OPENSSL_NO_ENGINE - if (e != NULL) - /* Free our "structural" reference. */ - ENGINE_free(e); -#endif -} - -static unsigned long index_serial_hash(const OPENSSL_CSTRING *a) -{ - const char *n; - - n = a[DB_serial]; - while (*n == '0') - n++; - return OPENSSL_LH_strhash(n); -} - -static int index_serial_cmp(const OPENSSL_CSTRING *a, - const OPENSSL_CSTRING *b) -{ - const char *aa, *bb; - - for (aa = a[DB_serial]; *aa == '0'; aa++) ; - for (bb = b[DB_serial]; *bb == '0'; bb++) ; - return strcmp(aa, bb); -} - -static int index_name_qual(char **a) -{ - return (a[0][0] == 'V'); -} - -static unsigned long index_name_hash(const OPENSSL_CSTRING *a) -{ - return OPENSSL_LH_strhash(a[DB_name]); -} - -int index_name_cmp(const OPENSSL_CSTRING *a, const OPENSSL_CSTRING *b) -{ - return strcmp(a[DB_name], b[DB_name]); -} - -static IMPLEMENT_LHASH_HASH_FN(index_serial, OPENSSL_CSTRING) -static IMPLEMENT_LHASH_COMP_FN(index_serial, OPENSSL_CSTRING) -static IMPLEMENT_LHASH_HASH_FN(index_name, OPENSSL_CSTRING) -static IMPLEMENT_LHASH_COMP_FN(index_name, OPENSSL_CSTRING) -#undef BSIZE -#define BSIZE 256 -BIGNUM *load_serial(const char *serialfile, int create, ASN1_INTEGER **retai) -{ - BIO *in = NULL; - BIGNUM *ret = NULL; - char buf[1024]; - ASN1_INTEGER *ai = NULL; - - ai = ASN1_INTEGER_new(); - if (ai == NULL) - goto err; - - in = BIO_new_file(serialfile, "r"); - if (in == NULL) { - if (!create) { - perror(serialfile); - goto err; - } - ERR_clear_error(); - ret = BN_new(); - if (ret == NULL || !rand_serial(ret, ai)) - BIO_printf(bio_err, "Out of memory\n"); - } else { - if (!a2i_ASN1_INTEGER(in, ai, buf, 1024)) { - BIO_printf(bio_err, "unable to load number from %s\n", - serialfile); - goto err; - } - ret = ASN1_INTEGER_to_BN(ai, NULL); - if (ret == NULL) { - BIO_printf(bio_err, - "error converting number from bin to BIGNUM\n"); - goto err; - } - } - - if (ret && retai) { - *retai = ai; - ai = NULL; - } - err: - BIO_free(in); - ASN1_INTEGER_free(ai); - return ret; -} - -int save_serial(const char *serialfile, const char *suffix, const BIGNUM *serial, - ASN1_INTEGER **retai) -{ - char buf[1][BSIZE]; - BIO *out = NULL; - int ret = 0; - ASN1_INTEGER *ai = NULL; - int j; - - if (suffix == NULL) - j = strlen(serialfile); - else - j = strlen(serialfile) + strlen(suffix) + 1; - if (j >= BSIZE) { - BIO_printf(bio_err, "file name too long\n"); - goto err; - } - - if (suffix == NULL) - OPENSSL_strlcpy(buf[0], serialfile, BSIZE); - else { -#ifndef OPENSSL_SYS_VMS - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s.%s", serialfile, suffix); -#else - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s-%s", serialfile, suffix); -#endif - } - out = BIO_new_file(buf[0], "w"); - if (out == NULL) { - ERR_print_errors(bio_err); - goto err; - } - - if ((ai = BN_to_ASN1_INTEGER(serial, NULL)) == NULL) { - BIO_printf(bio_err, "error converting serial to ASN.1 format\n"); - goto err; - } - i2a_ASN1_INTEGER(out, ai); - BIO_puts(out, "\n"); - ret = 1; - if (retai) { - *retai = ai; - ai = NULL; - } - err: - BIO_free_all(out); - ASN1_INTEGER_free(ai); - return ret; -} - -int rotate_serial(const char *serialfile, const char *new_suffix, - const char *old_suffix) -{ - char buf[2][BSIZE]; - int i, j; - - i = strlen(serialfile) + strlen(old_suffix); - j = strlen(serialfile) + strlen(new_suffix); - if (i > j) - j = i; - if (j + 1 >= BSIZE) { - BIO_printf(bio_err, "file name too long\n"); - goto err; - } -#ifndef OPENSSL_SYS_VMS - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s.%s", serialfile, new_suffix); - j = BIO_snprintf(buf[1], sizeof(buf[1]), "%s.%s", serialfile, old_suffix); -#else - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s-%s", serialfile, new_suffix); - j = BIO_snprintf(buf[1], sizeof(buf[1]), "%s-%s", serialfile, old_suffix); -#endif - if (rename(serialfile, buf[1]) < 0 && errno != ENOENT -#ifdef ENOTDIR - && errno != ENOTDIR -#endif - ) { - BIO_printf(bio_err, - "unable to rename %s to %s\n", serialfile, buf[1]); - perror("reason"); - goto err; - } - if (rename(buf[0], serialfile) < 0) { - BIO_printf(bio_err, - "unable to rename %s to %s\n", buf[0], serialfile); - perror("reason"); - rename(buf[1], serialfile); - goto err; - } - return 1; - err: - return 0; -} - -int rand_serial(BIGNUM *b, ASN1_INTEGER *ai) -{ - BIGNUM *btmp; - int ret = 0; - - btmp = b == NULL ? BN_new() : b; - if (btmp == NULL) - return 0; - - if (!BN_rand(btmp, SERIAL_RAND_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) - goto error; - if (ai && !BN_to_ASN1_INTEGER(btmp, ai)) - goto error; - - ret = 1; - - error: - - if (btmp != b) - BN_free(btmp); - - return ret; -} - -CA_DB *load_index(const char *dbfile, DB_ATTR *db_attr) -{ - CA_DB *retdb = NULL; - TXT_DB *tmpdb = NULL; - BIO *in; - CONF *dbattr_conf = NULL; - char buf[BSIZE]; -#ifndef OPENSSL_NO_POSIX_IO - FILE *dbfp; - struct stat dbst; -#endif - - in = BIO_new_file(dbfile, "r"); - if (in == NULL) { - ERR_print_errors(bio_err); - goto err; - } - -#ifndef OPENSSL_NO_POSIX_IO - BIO_get_fp(in, &dbfp); - if (fstat(fileno(dbfp), &dbst) == -1) { - SYSerr(SYS_F_FSTAT, errno); - ERR_add_error_data(3, "fstat('", dbfile, "')"); - ERR_print_errors(bio_err); - goto err; - } -#endif - - if ((tmpdb = TXT_DB_read(in, DB_NUMBER)) == NULL) - goto err; - -#ifndef OPENSSL_SYS_VMS - BIO_snprintf(buf, sizeof(buf), "%s.attr", dbfile); -#else - BIO_snprintf(buf, sizeof(buf), "%s-attr", dbfile); -#endif - dbattr_conf = app_load_config_quiet(buf); - - retdb = app_malloc(sizeof(*retdb), "new DB"); - retdb->db = tmpdb; - tmpdb = NULL; - if (db_attr) - retdb->attributes = *db_attr; - else { - retdb->attributes.unique_subject = 1; - } - - if (dbattr_conf) { - char *p = NCONF_get_string(dbattr_conf, NULL, "unique_subject"); - if (p) { - retdb->attributes.unique_subject = parse_yesno(p, 1); - } - } - - retdb->dbfname = OPENSSL_strdup(dbfile); -#ifndef OPENSSL_NO_POSIX_IO - retdb->dbst = dbst; -#endif - - err: - NCONF_free(dbattr_conf); - TXT_DB_free(tmpdb); - BIO_free_all(in); - return retdb; -} - -/* - * Returns > 0 on success, <= 0 on error - */ -int index_index(CA_DB *db) -{ - if (!TXT_DB_create_index(db->db, DB_serial, NULL, - LHASH_HASH_FN(index_serial), - LHASH_COMP_FN(index_serial))) { - BIO_printf(bio_err, - "error creating serial number index:(%ld,%ld,%ld)\n", - db->db->error, db->db->arg1, db->db->arg2); - return 0; - } - - if (db->attributes.unique_subject - && !TXT_DB_create_index(db->db, DB_name, index_name_qual, - LHASH_HASH_FN(index_name), - LHASH_COMP_FN(index_name))) { - BIO_printf(bio_err, "error creating name index:(%ld,%ld,%ld)\n", - db->db->error, db->db->arg1, db->db->arg2); - return 0; - } - return 1; -} - -int save_index(const char *dbfile, const char *suffix, CA_DB *db) -{ - char buf[3][BSIZE]; - BIO *out; - int j; - - j = strlen(dbfile) + strlen(suffix); - if (j + 6 >= BSIZE) { - BIO_printf(bio_err, "file name too long\n"); - goto err; - } -#ifndef OPENSSL_SYS_VMS - j = BIO_snprintf(buf[2], sizeof(buf[2]), "%s.attr", dbfile); - j = BIO_snprintf(buf[1], sizeof(buf[1]), "%s.attr.%s", dbfile, suffix); - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s.%s", dbfile, suffix); -#else - j = BIO_snprintf(buf[2], sizeof(buf[2]), "%s-attr", dbfile); - j = BIO_snprintf(buf[1], sizeof(buf[1]), "%s-attr-%s", dbfile, suffix); - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s-%s", dbfile, suffix); -#endif - out = BIO_new_file(buf[0], "w"); - if (out == NULL) { - perror(dbfile); - BIO_printf(bio_err, "unable to open '%s'\n", dbfile); - goto err; - } - j = TXT_DB_write(out, db->db); - BIO_free(out); - if (j <= 0) - goto err; - - out = BIO_new_file(buf[1], "w"); - if (out == NULL) { - perror(buf[2]); - BIO_printf(bio_err, "unable to open '%s'\n", buf[2]); - goto err; - } - BIO_printf(out, "unique_subject = %s\n", - db->attributes.unique_subject ? "yes" : "no"); - BIO_free(out); - - return 1; - err: - return 0; -} - -int rotate_index(const char *dbfile, const char *new_suffix, - const char *old_suffix) -{ - char buf[5][BSIZE]; - int i, j; - - i = strlen(dbfile) + strlen(old_suffix); - j = strlen(dbfile) + strlen(new_suffix); - if (i > j) - j = i; - if (j + 6 >= BSIZE) { - BIO_printf(bio_err, "file name too long\n"); - goto err; - } -#ifndef OPENSSL_SYS_VMS - j = BIO_snprintf(buf[4], sizeof(buf[4]), "%s.attr", dbfile); - j = BIO_snprintf(buf[3], sizeof(buf[3]), "%s.attr.%s", dbfile, old_suffix); - j = BIO_snprintf(buf[2], sizeof(buf[2]), "%s.attr.%s", dbfile, new_suffix); - j = BIO_snprintf(buf[1], sizeof(buf[1]), "%s.%s", dbfile, old_suffix); - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s.%s", dbfile, new_suffix); -#else - j = BIO_snprintf(buf[4], sizeof(buf[4]), "%s-attr", dbfile); - j = BIO_snprintf(buf[3], sizeof(buf[3]), "%s-attr-%s", dbfile, old_suffix); - j = BIO_snprintf(buf[2], sizeof(buf[2]), "%s-attr-%s", dbfile, new_suffix); - j = BIO_snprintf(buf[1], sizeof(buf[1]), "%s-%s", dbfile, old_suffix); - j = BIO_snprintf(buf[0], sizeof(buf[0]), "%s-%s", dbfile, new_suffix); -#endif - if (rename(dbfile, buf[1]) < 0 && errno != ENOENT -#ifdef ENOTDIR - && errno != ENOTDIR -#endif - ) { - BIO_printf(bio_err, "unable to rename %s to %s\n", dbfile, buf[1]); - perror("reason"); - goto err; - } - if (rename(buf[0], dbfile) < 0) { - BIO_printf(bio_err, "unable to rename %s to %s\n", buf[0], dbfile); - perror("reason"); - rename(buf[1], dbfile); - goto err; - } - if (rename(buf[4], buf[3]) < 0 && errno != ENOENT -#ifdef ENOTDIR - && errno != ENOTDIR -#endif - ) { - BIO_printf(bio_err, "unable to rename %s to %s\n", buf[4], buf[3]); - perror("reason"); - rename(dbfile, buf[0]); - rename(buf[1], dbfile); - goto err; - } - if (rename(buf[2], buf[4]) < 0) { - BIO_printf(bio_err, "unable to rename %s to %s\n", buf[2], buf[4]); - perror("reason"); - rename(buf[3], buf[4]); - rename(dbfile, buf[0]); - rename(buf[1], dbfile); - goto err; - } - return 1; - err: - return 0; -} - -void free_index(CA_DB *db) -{ - if (db) { - TXT_DB_free(db->db); - OPENSSL_free(db->dbfname); - OPENSSL_free(db); - } -} - -int parse_yesno(const char *str, int def) -{ - if (str) { - switch (*str) { - case 'f': /* false */ - case 'F': /* FALSE */ - case 'n': /* no */ - case 'N': /* NO */ - case '0': /* 0 */ - return 0; - case 't': /* true */ - case 'T': /* TRUE */ - case 'y': /* yes */ - case 'Y': /* YES */ - case '1': /* 1 */ - return 1; - } - } - return def; -} - -/* - * name is expected to be in the format /type0=value0/type1=value1/type2=... - * where characters may be escaped by \ - */ -X509_NAME *parse_name(const char *cp, long chtype, int canmulti) -{ - int nextismulti = 0; - char *work; - X509_NAME *n; - - if (*cp++ != '/') { - BIO_printf(bio_err, - "name is expected to be in the format " - "/type0=value0/type1=value1/type2=... where characters may " - "be escaped by \\. This name is not in that format: '%s'\n", - --cp); - return NULL; - } - - n = X509_NAME_new(); - if (n == NULL) - return NULL; - work = OPENSSL_strdup(cp); - if (work == NULL) - goto err; - - while (*cp) { - char *bp = work; - char *typestr = bp; - unsigned char *valstr; - int nid; - int ismulti = nextismulti; - nextismulti = 0; - - /* Collect the type */ - while (*cp && *cp != '=') - *bp++ = *cp++; - if (*cp == '\0') { - BIO_printf(bio_err, - "%s: Hit end of string before finding the equals.\n", - opt_getprog()); - goto err; - } - *bp++ = '\0'; - ++cp; - - /* Collect the value. */ - valstr = (unsigned char *)bp; - for (; *cp && *cp != '/'; *bp++ = *cp++) { - if (canmulti && *cp == '+') { - nextismulti = 1; - break; - } - if (*cp == '\\' && *++cp == '\0') { - BIO_printf(bio_err, - "%s: escape character at end of string\n", - opt_getprog()); - goto err; - } - } - *bp++ = '\0'; - - /* If not at EOS (must be + or /), move forward. */ - if (*cp) - ++cp; - - /* Parse */ - nid = OBJ_txt2nid(typestr); - if (nid == NID_undef) { - BIO_printf(bio_err, "%s: Skipping unknown attribute \"%s\"\n", - opt_getprog(), typestr); - continue; - } - if (*valstr == '\0') { - BIO_printf(bio_err, - "%s: No value provided for Subject Attribute %s, skipped\n", - opt_getprog(), typestr); - continue; - } - if (!X509_NAME_add_entry_by_NID(n, nid, chtype, - valstr, strlen((char *)valstr), - -1, ismulti ? -1 : 0)) - goto err; - } - - OPENSSL_free(work); - return n; - - err: - X509_NAME_free(n); - OPENSSL_free(work); - return NULL; -} - -/* - * Read whole contents of a BIO into an allocated memory buffer and return - * it. - */ - -int bio_to_mem(unsigned char **out, int maxlen, BIO *in) -{ - BIO *mem; - int len, ret; - unsigned char tbuf[1024]; - - mem = BIO_new(BIO_s_mem()); - if (mem == NULL) - return -1; - for (;;) { - if ((maxlen != -1) && maxlen < 1024) - len = maxlen; - else - len = 1024; - len = BIO_read(in, tbuf, len); - if (len < 0) { - BIO_free(mem); - return -1; - } - if (len == 0) - break; - if (BIO_write(mem, tbuf, len) != len) { - BIO_free(mem); - return -1; - } - maxlen -= len; - - if (maxlen == 0) - break; - } - ret = BIO_get_mem_data(mem, (char **)out); - BIO_set_flags(mem, BIO_FLAGS_MEM_RDONLY); - BIO_free(mem); - return ret; -} - -int pkey_ctrl_string(EVP_PKEY_CTX *ctx, const char *value) -{ - int rv; - char *stmp, *vtmp = NULL; - stmp = OPENSSL_strdup(value); - if (!stmp) - return -1; - vtmp = strchr(stmp, ':'); - if (vtmp) { - *vtmp = 0; - vtmp++; - } - rv = EVP_PKEY_CTX_ctrl_str(ctx, stmp, vtmp); - OPENSSL_free(stmp); - return rv; -} - -static void nodes_print(const char *name, STACK_OF(X509_POLICY_NODE) *nodes) -{ - X509_POLICY_NODE *node; - int i; - - BIO_printf(bio_err, "%s Policies:", name); - if (nodes) { - BIO_puts(bio_err, "\n"); - for (i = 0; i < sk_X509_POLICY_NODE_num(nodes); i++) { - node = sk_X509_POLICY_NODE_value(nodes, i); - X509_POLICY_NODE_print(bio_err, node, 2); - } - } else { - BIO_puts(bio_err, " <empty>\n"); - } -} - -void policies_print(X509_STORE_CTX *ctx) -{ - X509_POLICY_TREE *tree; - int explicit_policy; - tree = X509_STORE_CTX_get0_policy_tree(ctx); - explicit_policy = X509_STORE_CTX_get_explicit_policy(ctx); - - BIO_printf(bio_err, "Require explicit Policy: %s\n", - explicit_policy ? "True" : "False"); - - nodes_print("Authority", X509_policy_tree_get0_policies(tree)); - nodes_print("User", X509_policy_tree_get0_user_policies(tree)); -} - -/*- - * next_protos_parse parses a comma separated list of strings into a string - * in a format suitable for passing to SSL_CTX_set_next_protos_advertised. - * outlen: (output) set to the length of the resulting buffer on success. - * err: (maybe NULL) on failure, an error message line is written to this BIO. - * in: a NUL terminated string like "abc,def,ghi" - * - * returns: a malloc'd buffer or NULL on failure. - */ -unsigned char *next_protos_parse(size_t *outlen, const char *in) -{ - size_t len; - unsigned char *out; - size_t i, start = 0; - size_t skipped = 0; - - len = strlen(in); - if (len == 0 || len >= 65535) - return NULL; - - out = app_malloc(len + 1, "NPN buffer"); - for (i = 0; i <= len; ++i) { - if (i == len || in[i] == ',') { - /* - * Zero-length ALPN elements are invalid on the wire, we could be - * strict and reject the entire string, but just ignoring extra - * commas seems harmless and more friendly. - * - * Every comma we skip in this way puts the input buffer another - * byte ahead of the output buffer, so all stores into the output - * buffer need to be decremented by the number commas skipped. - */ - if (i == start) { - ++start; - ++skipped; - continue; - } - if (i - start > 255) { - OPENSSL_free(out); - return NULL; - } - out[start-skipped] = (unsigned char)(i - start); - start = i + 1; - } else { - out[i + 1 - skipped] = in[i]; - } - } - - if (len <= skipped) { - OPENSSL_free(out); - return NULL; - } - - *outlen = len + 1 - skipped; - return out; -} - -void print_cert_checks(BIO *bio, X509 *x, - const char *checkhost, - const char *checkemail, const char *checkip) -{ - if (x == NULL) - return; - if (checkhost) { - BIO_printf(bio, "Hostname %s does%s match certificate\n", - checkhost, - X509_check_host(x, checkhost, 0, 0, NULL) == 1 - ? "" : " NOT"); - } - - if (checkemail) { - BIO_printf(bio, "Email %s does%s match certificate\n", - checkemail, X509_check_email(x, checkemail, 0, 0) - ? "" : " NOT"); - } - - if (checkip) { - BIO_printf(bio, "IP %s does%s match certificate\n", - checkip, X509_check_ip_asc(x, checkip, 0) ? "" : " NOT"); - } -} - -/* Get first http URL from a DIST_POINT structure */ - -static const char *get_dp_url(DIST_POINT *dp) -{ - GENERAL_NAMES *gens; - GENERAL_NAME *gen; - int i, gtype; - ASN1_STRING *uri; - if (!dp->distpoint || dp->distpoint->type != 0) - return NULL; - gens = dp->distpoint->name.fullname; - for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) { - gen = sk_GENERAL_NAME_value(gens, i); - uri = GENERAL_NAME_get0_value(gen, >ype); - if (gtype == GEN_URI && ASN1_STRING_length(uri) > 6) { - const char *uptr = (const char *)ASN1_STRING_get0_data(uri); - if (strncmp(uptr, "http://", 7) == 0) - return uptr; - } - } - return NULL; -} - -/* - * Look through a CRLDP structure and attempt to find an http URL to - * downloads a CRL from. - */ - -static X509_CRL *load_crl_crldp(STACK_OF(DIST_POINT) *crldp) -{ - int i; - const char *urlptr = NULL; - for (i = 0; i < sk_DIST_POINT_num(crldp); i++) { - DIST_POINT *dp = sk_DIST_POINT_value(crldp, i); - urlptr = get_dp_url(dp); - if (urlptr) - return load_crl(urlptr, FORMAT_HTTP); - } - return NULL; -} - -/* - * Example of downloading CRLs from CRLDP: not usable for real world as it - * always downloads, doesn't support non-blocking I/O and doesn't cache - * anything. - */ - -static STACK_OF(X509_CRL) *crls_http_cb(X509_STORE_CTX *ctx, X509_NAME *nm) -{ - X509 *x; - STACK_OF(X509_CRL) *crls = NULL; - X509_CRL *crl; - STACK_OF(DIST_POINT) *crldp; - - crls = sk_X509_CRL_new_null(); - if (!crls) - return NULL; - x = X509_STORE_CTX_get_current_cert(ctx); - crldp = X509_get_ext_d2i(x, NID_crl_distribution_points, NULL, NULL); - crl = load_crl_crldp(crldp); - sk_DIST_POINT_pop_free(crldp, DIST_POINT_free); - if (!crl) { - sk_X509_CRL_free(crls); - return NULL; - } - sk_X509_CRL_push(crls, crl); - /* Try to download delta CRL */ - crldp = X509_get_ext_d2i(x, NID_freshest_crl, NULL, NULL); - crl = load_crl_crldp(crldp); - sk_DIST_POINT_pop_free(crldp, DIST_POINT_free); - if (crl) - sk_X509_CRL_push(crls, crl); - return crls; -} - -void store_setup_crl_download(X509_STORE *st) -{ - X509_STORE_set_lookup_crls_cb(st, crls_http_cb); -} - -/* - * Platform-specific sections - */ -#if defined(_WIN32) -# ifdef fileno -# undef fileno -# define fileno(a) (int)_fileno(a) -# endif - -# include <windows.h> -# include <tchar.h> - -static int WIN32_rename(const char *from, const char *to) -{ - TCHAR *tfrom = NULL, *tto; - DWORD err; - int ret = 0; - - if (sizeof(TCHAR) == 1) { - tfrom = (TCHAR *)from; - tto = (TCHAR *)to; - } else { /* UNICODE path */ - - size_t i, flen = strlen(from) + 1, tlen = strlen(to) + 1; - tfrom = malloc(sizeof(*tfrom) * (flen + tlen)); - if (tfrom == NULL) - goto err; - tto = tfrom + flen; -# if !defined(_WIN32_WCE) || _WIN32_WCE>=101 - if (!MultiByteToWideChar(CP_ACP, 0, from, flen, (WCHAR *)tfrom, flen)) -# endif - for (i = 0; i < flen; i++) - tfrom[i] = (TCHAR)from[i]; -# if !defined(_WIN32_WCE) || _WIN32_WCE>=101 - if (!MultiByteToWideChar(CP_ACP, 0, to, tlen, (WCHAR *)tto, tlen)) -# endif - for (i = 0; i < tlen; i++) - tto[i] = (TCHAR)to[i]; - } - - if (MoveFile(tfrom, tto)) - goto ok; - err = GetLastError(); - if (err == ERROR_ALREADY_EXISTS || err == ERROR_FILE_EXISTS) { - if (DeleteFile(tto) && MoveFile(tfrom, tto)) - goto ok; - err = GetLastError(); - } - if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) - errno = ENOENT; - else if (err == ERROR_ACCESS_DENIED) - errno = EACCES; - else - errno = EINVAL; /* we could map more codes... */ - err: - ret = -1; - ok: - if (tfrom != NULL && tfrom != (TCHAR *)from) - free(tfrom); - return ret; -} -#endif - -/* app_tminterval section */ -#if defined(_WIN32) -double app_tminterval(int stop, int usertime) -{ - FILETIME now; - double ret = 0; - static ULARGE_INTEGER tmstart; - static int warning = 1; -# ifdef _WIN32_WINNT - static HANDLE proc = NULL; - - if (proc == NULL) { - if (check_winnt()) - proc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, - GetCurrentProcessId()); - if (proc == NULL) - proc = (HANDLE) - 1; - } - - if (usertime && proc != (HANDLE) - 1) { - FILETIME junk; - GetProcessTimes(proc, &junk, &junk, &junk, &now); - } else -# endif - { - SYSTEMTIME systime; - - if (usertime && warning) { - BIO_printf(bio_err, "To get meaningful results, run " - "this program on idle system.\n"); - warning = 0; - } - GetSystemTime(&systime); - SystemTimeToFileTime(&systime, &now); - } - - if (stop == TM_START) { - tmstart.u.LowPart = now.dwLowDateTime; - tmstart.u.HighPart = now.dwHighDateTime; - } else { - ULARGE_INTEGER tmstop; - - tmstop.u.LowPart = now.dwLowDateTime; - tmstop.u.HighPart = now.dwHighDateTime; - - ret = (__int64)(tmstop.QuadPart - tmstart.QuadPart) * 1e-7; - } - - return ret; -} -#elif defined(OPENSSL_SYS_VXWORKS) -# include <time.h> - -double app_tminterval(int stop, int usertime) -{ - double ret = 0; -# ifdef CLOCK_REALTIME - static struct timespec tmstart; - struct timespec now; -# else - static unsigned long tmstart; - unsigned long now; -# endif - static int warning = 1; - - if (usertime && warning) { - BIO_printf(bio_err, "To get meaningful results, run " - "this program on idle system.\n"); - warning = 0; - } -# ifdef CLOCK_REALTIME - clock_gettime(CLOCK_REALTIME, &now); - if (stop == TM_START) - tmstart = now; - else - ret = ((now.tv_sec + now.tv_nsec * 1e-9) - - (tmstart.tv_sec + tmstart.tv_nsec * 1e-9)); -# else - now = tickGet(); - if (stop == TM_START) - tmstart = now; - else - ret = (now - tmstart) / (double)sysClkRateGet(); -# endif - return ret; -} - -#elif defined(OPENSSL_SYSTEM_VMS) -# include <time.h> -# include <times.h> - -double app_tminterval(int stop, int usertime) -{ - static clock_t tmstart; - double ret = 0; - clock_t now; -# ifdef __TMS - struct tms rus; - - now = times(&rus); - if (usertime) - now = rus.tms_utime; -# else - if (usertime) - now = clock(); /* sum of user and kernel times */ - else { - struct timeval tv; - gettimeofday(&tv, NULL); - now = (clock_t)((unsigned long long)tv.tv_sec * CLK_TCK + - (unsigned long long)tv.tv_usec * (1000000 / CLK_TCK) - ); - } -# endif - if (stop == TM_START) - tmstart = now; - else - ret = (now - tmstart) / (double)(CLK_TCK); - - return ret; -} - -#elif defined(_SC_CLK_TCK) /* by means of unistd.h */ -# include <sys/times.h> - -double app_tminterval(int stop, int usertime) -{ - double ret = 0; - struct tms rus; - clock_t now = times(&rus); - static clock_t tmstart; - - if (usertime) - now = rus.tms_utime; - - if (stop == TM_START) { - tmstart = now; - } else { - long int tck = sysconf(_SC_CLK_TCK); - ret = (now - tmstart) / (double)tck; - } - - return ret; -} - -#else -# include <sys/time.h> -# include <sys/resource.h> - -double app_tminterval(int stop, int usertime) -{ - double ret = 0; - struct rusage rus; - struct timeval now; - static struct timeval tmstart; - - if (usertime) - getrusage(RUSAGE_SELF, &rus), now = rus.ru_utime; - else - gettimeofday(&now, NULL); - - if (stop == TM_START) - tmstart = now; - else - ret = ((now.tv_sec + now.tv_usec * 1e-6) - - (tmstart.tv_sec + tmstart.tv_usec * 1e-6)); - - return ret; -} -#endif - -int app_access(const char* name, int flag) -{ -#ifdef _WIN32 - return _access(name, flag); -#else - return access(name, flag); -#endif -} - -/* app_isdir section */ -#ifdef _WIN32 -int app_isdir(const char *name) -{ - DWORD attr; -# if defined(UNICODE) || defined(_UNICODE) - size_t i, len_0 = strlen(name) + 1; - WCHAR tempname[MAX_PATH]; - - if (len_0 > MAX_PATH) - return -1; - -# if !defined(_WIN32_WCE) || _WIN32_WCE>=101 - if (!MultiByteToWideChar(CP_ACP, 0, name, len_0, tempname, MAX_PATH)) -# endif - for (i = 0; i < len_0; i++) - tempname[i] = (WCHAR)name[i]; - - attr = GetFileAttributes(tempname); -# else - attr = GetFileAttributes(name); -# endif - if (attr == INVALID_FILE_ATTRIBUTES) - return -1; - return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0); -} -#else -# include <sys/stat.h> -# ifndef S_ISDIR -# if defined(_S_IFMT) && defined(_S_IFDIR) -# define S_ISDIR(a) (((a) & _S_IFMT) == _S_IFDIR) -# else -# define S_ISDIR(a) (((a) & S_IFMT) == S_IFDIR) -# endif -# endif - -int app_isdir(const char *name) -{ -# if defined(S_ISDIR) - struct stat st; - - if (stat(name, &st) == 0) - return S_ISDIR(st.st_mode); - else - return -1; -# else - return -1; -# endif -} -#endif - -/* raw_read|write section */ -#if defined(__VMS) -# include "vms_term_sock.h" -static int stdin_sock = -1; - -static void close_stdin_sock(void) -{ - TerminalSocket (TERM_SOCK_DELETE, &stdin_sock); -} - -int fileno_stdin(void) -{ - if (stdin_sock == -1) { - TerminalSocket(TERM_SOCK_CREATE, &stdin_sock); - atexit(close_stdin_sock); - } - - return stdin_sock; -} -#else -int fileno_stdin(void) -{ - return fileno(stdin); -} -#endif - -int fileno_stdout(void) -{ - return fileno(stdout); -} - -#if defined(_WIN32) && defined(STD_INPUT_HANDLE) -int raw_read_stdin(void *buf, int siz) -{ - DWORD n; - if (ReadFile(GetStdHandle(STD_INPUT_HANDLE), buf, siz, &n, NULL)) - return n; - else - return -1; -} -#elif defined(__VMS) -# include <sys/socket.h> - -int raw_read_stdin(void *buf, int siz) -{ - return recv(fileno_stdin(), buf, siz, 0); -} -#else -int raw_read_stdin(void *buf, int siz) -{ - return read(fileno_stdin(), buf, siz); -} -#endif - -#if defined(_WIN32) && defined(STD_OUTPUT_HANDLE) -int raw_write_stdout(const void *buf, int siz) -{ - DWORD n; - if (WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buf, siz, &n, NULL)) - return n; - else - return -1; -} -#else -int raw_write_stdout(const void *buf, int siz) -{ - return write(fileno_stdout(), buf, siz); -} -#endif - -/* - * Centralized handling if input and output files with format specification - * The format is meant to show what the input and output is supposed to be, - * and is therefore a show of intent more than anything else. However, it - * does impact behavior on some platform, such as differentiating between - * text and binary input/output on non-Unix platforms - */ -static int istext(int format) -{ - return (format & B_FORMAT_TEXT) == B_FORMAT_TEXT; -} - -BIO *dup_bio_in(int format) -{ - return BIO_new_fp(stdin, - BIO_NOCLOSE | (istext(format) ? BIO_FP_TEXT : 0)); -} - -static BIO_METHOD *prefix_method = NULL; - -BIO *dup_bio_out(int format) -{ - BIO *b = BIO_new_fp(stdout, - BIO_NOCLOSE | (istext(format) ? BIO_FP_TEXT : 0)); - void *prefix = NULL; - -#ifdef OPENSSL_SYS_VMS - if (istext(format)) - b = BIO_push(BIO_new(BIO_f_linebuffer()), b); -#endif - - if (istext(format) && (prefix = getenv("HARNESS_OSSL_PREFIX")) != NULL) { - if (prefix_method == NULL) - prefix_method = apps_bf_prefix(); - b = BIO_push(BIO_new(prefix_method), b); - BIO_ctrl(b, PREFIX_CTRL_SET_PREFIX, 0, prefix); - } - - return b; -} - -BIO *dup_bio_err(int format) -{ - BIO *b = BIO_new_fp(stderr, - BIO_NOCLOSE | (istext(format) ? BIO_FP_TEXT : 0)); -#ifdef OPENSSL_SYS_VMS - if (istext(format)) - b = BIO_push(BIO_new(BIO_f_linebuffer()), b); -#endif - return b; -} - -void destroy_prefix_method(void) -{ - BIO_meth_free(prefix_method); - prefix_method = NULL; -} - -void unbuffer(FILE *fp) -{ -/* - * On VMS, setbuf() will only take 32-bit pointers, and a compilation - * with /POINTER_SIZE=64 will give off a MAYLOSEDATA2 warning here. - * However, we trust that the C RTL will never give us a FILE pointer - * above the first 4 GB of memory, so we simply turn off the warning - * temporarily. - */ -#if defined(OPENSSL_SYS_VMS) && defined(__DECC) -# pragma environment save -# pragma message disable maylosedata2 -#endif - setbuf(fp, NULL); -#if defined(OPENSSL_SYS_VMS) && defined(__DECC) -# pragma environment restore -#endif -} - -static const char *modestr(char mode, int format) -{ - OPENSSL_assert(mode == 'a' || mode == 'r' || mode == 'w'); - - switch (mode) { - case 'a': - return istext(format) ? "a" : "ab"; - case 'r': - return istext(format) ? "r" : "rb"; - case 'w': - return istext(format) ? "w" : "wb"; - } - /* The assert above should make sure we never reach this point */ - return NULL; -} - -static const char *modeverb(char mode) -{ - switch (mode) { - case 'a': - return "appending"; - case 'r': - return "reading"; - case 'w': - return "writing"; - } - return "(doing something)"; -} - -/* - * Open a file for writing, owner-read-only. - */ -BIO *bio_open_owner(const char *filename, int format, int private) -{ - FILE *fp = NULL; - BIO *b = NULL; - int fd = -1, bflags, mode, textmode; - - if (!private || filename == NULL || strcmp(filename, "-") == 0) - return bio_open_default(filename, 'w', format); - - mode = O_WRONLY; -#ifdef O_CREAT - mode |= O_CREAT; -#endif -#ifdef O_TRUNC - mode |= O_TRUNC; -#endif - textmode = istext(format); - if (!textmode) { -#ifdef O_BINARY - mode |= O_BINARY; -#elif defined(_O_BINARY) - mode |= _O_BINARY; -#endif - } - -#ifdef OPENSSL_SYS_VMS - /* VMS doesn't have O_BINARY, it just doesn't make sense. But, - * it still needs to know that we're going binary, or fdopen() - * will fail with "invalid argument"... so we tell VMS what the - * context is. - */ - if (!textmode) - fd = open(filename, mode, 0600, "ctx=bin"); - else -#endif - fd = open(filename, mode, 0600); - if (fd < 0) - goto err; - fp = fdopen(fd, modestr('w', format)); - if (fp == NULL) - goto err; - bflags = BIO_CLOSE; - if (textmode) - bflags |= BIO_FP_TEXT; - b = BIO_new_fp(fp, bflags); - if (b) - return b; - - err: - BIO_printf(bio_err, "%s: Can't open \"%s\" for writing, %s\n", - opt_getprog(), filename, strerror(errno)); - ERR_print_errors(bio_err); - /* If we have fp, then fdopen took over fd, so don't close both. */ - if (fp) - fclose(fp); - else if (fd >= 0) - close(fd); - return NULL; -} - -static BIO *bio_open_default_(const char *filename, char mode, int format, - int quiet) -{ - BIO *ret; - - if (filename == NULL || strcmp(filename, "-") == 0) { - ret = mode == 'r' ? dup_bio_in(format) : dup_bio_out(format); - if (quiet) { - ERR_clear_error(); - return ret; - } - if (ret != NULL) - return ret; - BIO_printf(bio_err, - "Can't open %s, %s\n", - mode == 'r' ? "stdin" : "stdout", strerror(errno)); - } else { - ret = BIO_new_file(filename, modestr(mode, format)); - if (quiet) { - ERR_clear_error(); - return ret; - } - if (ret != NULL) - return ret; - BIO_printf(bio_err, - "Can't open %s for %s, %s\n", - filename, modeverb(mode), strerror(errno)); - } - ERR_print_errors(bio_err); - return NULL; -} - -BIO *bio_open_default(const char *filename, char mode, int format) -{ - return bio_open_default_(filename, mode, format, 0); -} - -BIO *bio_open_default_quiet(const char *filename, char mode, int format) -{ - return bio_open_default_(filename, mode, format, 1); -} - -void wait_for_async(SSL *s) -{ - /* On Windows select only works for sockets, so we simply don't wait */ -#ifndef OPENSSL_SYS_WINDOWS - int width = 0; - fd_set asyncfds; - OSSL_ASYNC_FD *fds; - size_t numfds; - size_t i; - - if (!SSL_get_all_async_fds(s, NULL, &numfds)) - return; - if (numfds == 0) - return; - fds = app_malloc(sizeof(OSSL_ASYNC_FD) * numfds, "allocate async fds"); - if (!SSL_get_all_async_fds(s, fds, &numfds)) { - OPENSSL_free(fds); - return; - } - - FD_ZERO(&asyncfds); - for (i = 0; i < numfds; i++) { - if (width <= (int)fds[i]) - width = (int)fds[i] + 1; - openssl_fdset((int)fds[i], &asyncfds); - } - select(width, (void *)&asyncfds, NULL, NULL, NULL); - OPENSSL_free(fds); -#endif -} - -/* if OPENSSL_SYS_WINDOWS is defined then so is OPENSSL_SYS_MSDOS */ -#if defined(OPENSSL_SYS_MSDOS) -int has_stdin_waiting(void) -{ -# if defined(OPENSSL_SYS_WINDOWS) - HANDLE inhand = GetStdHandle(STD_INPUT_HANDLE); - DWORD events = 0; - INPUT_RECORD inputrec; - DWORD insize = 1; - BOOL peeked; - - if (inhand == INVALID_HANDLE_VALUE) { - return 0; - } - - peeked = PeekConsoleInput(inhand, &inputrec, insize, &events); - if (!peeked) { - /* Probably redirected input? _kbhit() does not work in this case */ - if (!feof(stdin)) { - return 1; - } - return 0; - } -# endif - return _kbhit(); -} -#endif - -/* Corrupt a signature by modifying final byte */ -void corrupt_signature(const ASN1_STRING *signature) -{ - unsigned char *s = signature->data; - s[signature->length - 1] ^= 0x1; -} - -int set_cert_times(X509 *x, const char *startdate, const char *enddate, - int days) -{ - if (startdate == NULL || strcmp(startdate, "today") == 0) { - if (X509_gmtime_adj(X509_getm_notBefore(x), 0) == NULL) - return 0; - } else { - if (!ASN1_TIME_set_string_X509(X509_getm_notBefore(x), startdate)) - return 0; - } - if (enddate == NULL) { - if (X509_time_adj_ex(X509_getm_notAfter(x), days, 0, NULL) - == NULL) - return 0; - } else if (!ASN1_TIME_set_string_X509(X509_getm_notAfter(x), enddate)) { - return 0; - } - return 1; -} - -void make_uppercase(char *string) -{ - int i; - - for (i = 0; string[i] != '\0'; i++) - string[i] = toupper((unsigned char)string[i]); -} diff --git a/contrib/libs/openssl/apps/apps.h b/contrib/libs/openssl/apps/apps.h deleted file mode 100644 index 34c3fd8633..0000000000 --- a/contrib/libs/openssl/apps/apps.h +++ /dev/null @@ -1,632 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#ifndef OSSL_APPS_H -# define OSSL_APPS_H - -# include "e_os.h" /* struct timeval for DTLS */ -# include "internal/nelem.h" -# include <assert.h> - -# include <sys/types.h> -# ifndef OPENSSL_NO_POSIX_IO -# include <sys/stat.h> -# include <fcntl.h> -# endif - -# include <openssl/e_os2.h> -# include <openssl/ossl_typ.h> -# include <openssl/bio.h> -# include <openssl/x509.h> -# include <openssl/conf.h> -# include <openssl/txt_db.h> -# include <openssl/engine.h> -# include <openssl/ocsp.h> -# include <signal.h> - -# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINCE) -# define openssl_fdset(a,b) FD_SET((unsigned int)a, b) -# else -# define openssl_fdset(a,b) FD_SET(a, b) -# endif - -/* - * quick macro when you need to pass an unsigned char instead of a char. - * this is true for some implementations of the is*() functions, for - * example. - */ -#define _UC(c) ((unsigned char)(c)) - -void app_RAND_load_conf(CONF *c, const char *section); -void app_RAND_write(void); - -extern char *default_config_file; -extern BIO *bio_in; -extern BIO *bio_out; -extern BIO *bio_err; -extern const unsigned char tls13_aes128gcmsha256_id[]; -extern const unsigned char tls13_aes256gcmsha384_id[]; -extern BIO_ADDR *ourpeer; - -BIO_METHOD *apps_bf_prefix(void); -/* - * The control used to set the prefix with BIO_ctrl() - * We make it high enough so the chance of ever clashing with the BIO library - * remains unlikely for the foreseeable future and beyond. - */ -#define PREFIX_CTRL_SET_PREFIX (1 << 15) -/* - * apps_bf_prefix() returns a dynamically created BIO_METHOD, which we - * need to destroy at some point. When created internally, it's stored - * in an internal pointer which can be freed with the following function - */ -void destroy_prefix_method(void); - -BIO *dup_bio_in(int format); -BIO *dup_bio_out(int format); -BIO *dup_bio_err(int format); -BIO *bio_open_owner(const char *filename, int format, int private); -BIO *bio_open_default(const char *filename, char mode, int format); -BIO *bio_open_default_quiet(const char *filename, char mode, int format); -CONF *app_load_config_bio(BIO *in, const char *filename); -CONF *app_load_config(const char *filename); -CONF *app_load_config_quiet(const char *filename); -int app_load_modules(const CONF *config); -void unbuffer(FILE *fp); -void wait_for_async(SSL *s); -# if defined(OPENSSL_SYS_MSDOS) -int has_stdin_waiting(void); -# endif - -void corrupt_signature(const ASN1_STRING *signature); -int set_cert_times(X509 *x, const char *startdate, const char *enddate, - int days); - -/* - * Common verification options. - */ -# define OPT_V_ENUM \ - OPT_V__FIRST=2000, \ - OPT_V_POLICY, OPT_V_PURPOSE, OPT_V_VERIFY_NAME, OPT_V_VERIFY_DEPTH, \ - OPT_V_ATTIME, OPT_V_VERIFY_HOSTNAME, OPT_V_VERIFY_EMAIL, \ - OPT_V_VERIFY_IP, OPT_V_IGNORE_CRITICAL, OPT_V_ISSUER_CHECKS, \ - OPT_V_CRL_CHECK, OPT_V_CRL_CHECK_ALL, OPT_V_POLICY_CHECK, \ - OPT_V_EXPLICIT_POLICY, OPT_V_INHIBIT_ANY, OPT_V_INHIBIT_MAP, \ - OPT_V_X509_STRICT, OPT_V_EXTENDED_CRL, OPT_V_USE_DELTAS, \ - OPT_V_POLICY_PRINT, OPT_V_CHECK_SS_SIG, OPT_V_TRUSTED_FIRST, \ - OPT_V_SUITEB_128_ONLY, OPT_V_SUITEB_128, OPT_V_SUITEB_192, \ - OPT_V_PARTIAL_CHAIN, OPT_V_NO_ALT_CHAINS, OPT_V_NO_CHECK_TIME, \ - OPT_V_VERIFY_AUTH_LEVEL, OPT_V_ALLOW_PROXY_CERTS, \ - OPT_V__LAST - -# define OPT_V_OPTIONS \ - { "policy", OPT_V_POLICY, 's', "adds policy to the acceptable policy set"}, \ - { "purpose", OPT_V_PURPOSE, 's', \ - "certificate chain purpose"}, \ - { "verify_name", OPT_V_VERIFY_NAME, 's', "verification policy name"}, \ - { "verify_depth", OPT_V_VERIFY_DEPTH, 'n', \ - "chain depth limit" }, \ - { "auth_level", OPT_V_VERIFY_AUTH_LEVEL, 'n', \ - "chain authentication security level" }, \ - { "attime", OPT_V_ATTIME, 'M', "verification epoch time" }, \ - { "verify_hostname", OPT_V_VERIFY_HOSTNAME, 's', \ - "expected peer hostname" }, \ - { "verify_email", OPT_V_VERIFY_EMAIL, 's', \ - "expected peer email" }, \ - { "verify_ip", OPT_V_VERIFY_IP, 's', \ - "expected peer IP address" }, \ - { "ignore_critical", OPT_V_IGNORE_CRITICAL, '-', \ - "permit unhandled critical extensions"}, \ - { "issuer_checks", OPT_V_ISSUER_CHECKS, '-', "(deprecated)"}, \ - { "crl_check", OPT_V_CRL_CHECK, '-', "check leaf certificate revocation" }, \ - { "crl_check_all", OPT_V_CRL_CHECK_ALL, '-', "check full chain revocation" }, \ - { "policy_check", OPT_V_POLICY_CHECK, '-', "perform rfc5280 policy checks"}, \ - { "explicit_policy", OPT_V_EXPLICIT_POLICY, '-', \ - "set policy variable require-explicit-policy"}, \ - { "inhibit_any", OPT_V_INHIBIT_ANY, '-', \ - "set policy variable inhibit-any-policy"}, \ - { "inhibit_map", OPT_V_INHIBIT_MAP, '-', \ - "set policy variable inhibit-policy-mapping"}, \ - { "x509_strict", OPT_V_X509_STRICT, '-', \ - "disable certificate compatibility work-arounds"}, \ - { "extended_crl", OPT_V_EXTENDED_CRL, '-', \ - "enable extended CRL features"}, \ - { "use_deltas", OPT_V_USE_DELTAS, '-', \ - "use delta CRLs"}, \ - { "policy_print", OPT_V_POLICY_PRINT, '-', \ - "print policy processing diagnostics"}, \ - { "check_ss_sig", OPT_V_CHECK_SS_SIG, '-', \ - "check root CA self-signatures"}, \ - { "trusted_first", OPT_V_TRUSTED_FIRST, '-', \ - "search trust store first (default)" }, \ - { "suiteB_128_only", OPT_V_SUITEB_128_ONLY, '-', "Suite B 128-bit-only mode"}, \ - { "suiteB_128", OPT_V_SUITEB_128, '-', \ - "Suite B 128-bit mode allowing 192-bit algorithms"}, \ - { "suiteB_192", OPT_V_SUITEB_192, '-', "Suite B 192-bit-only mode" }, \ - { "partial_chain", OPT_V_PARTIAL_CHAIN, '-', \ - "accept chains anchored by intermediate trust-store CAs"}, \ - { "no_alt_chains", OPT_V_NO_ALT_CHAINS, '-', "(deprecated)" }, \ - { "no_check_time", OPT_V_NO_CHECK_TIME, '-', "ignore certificate validity time" }, \ - { "allow_proxy_certs", OPT_V_ALLOW_PROXY_CERTS, '-', "allow the use of proxy certificates" } - -# define OPT_V_CASES \ - OPT_V__FIRST: case OPT_V__LAST: break; \ - case OPT_V_POLICY: \ - case OPT_V_PURPOSE: \ - case OPT_V_VERIFY_NAME: \ - case OPT_V_VERIFY_DEPTH: \ - case OPT_V_VERIFY_AUTH_LEVEL: \ - case OPT_V_ATTIME: \ - case OPT_V_VERIFY_HOSTNAME: \ - case OPT_V_VERIFY_EMAIL: \ - case OPT_V_VERIFY_IP: \ - case OPT_V_IGNORE_CRITICAL: \ - case OPT_V_ISSUER_CHECKS: \ - case OPT_V_CRL_CHECK: \ - case OPT_V_CRL_CHECK_ALL: \ - case OPT_V_POLICY_CHECK: \ - case OPT_V_EXPLICIT_POLICY: \ - case OPT_V_INHIBIT_ANY: \ - case OPT_V_INHIBIT_MAP: \ - case OPT_V_X509_STRICT: \ - case OPT_V_EXTENDED_CRL: \ - case OPT_V_USE_DELTAS: \ - case OPT_V_POLICY_PRINT: \ - case OPT_V_CHECK_SS_SIG: \ - case OPT_V_TRUSTED_FIRST: \ - case OPT_V_SUITEB_128_ONLY: \ - case OPT_V_SUITEB_128: \ - case OPT_V_SUITEB_192: \ - case OPT_V_PARTIAL_CHAIN: \ - case OPT_V_NO_ALT_CHAINS: \ - case OPT_V_NO_CHECK_TIME: \ - case OPT_V_ALLOW_PROXY_CERTS - -/* - * Common "extended validation" options. - */ -# define OPT_X_ENUM \ - OPT_X__FIRST=1000, \ - OPT_X_KEY, OPT_X_CERT, OPT_X_CHAIN, OPT_X_CHAIN_BUILD, \ - OPT_X_CERTFORM, OPT_X_KEYFORM, \ - OPT_X__LAST - -# define OPT_X_OPTIONS \ - { "xkey", OPT_X_KEY, '<', "key for Extended certificates"}, \ - { "xcert", OPT_X_CERT, '<', "cert for Extended certificates"}, \ - { "xchain", OPT_X_CHAIN, '<', "chain for Extended certificates"}, \ - { "xchain_build", OPT_X_CHAIN_BUILD, '-', \ - "build certificate chain for the extended certificates"}, \ - { "xcertform", OPT_X_CERTFORM, 'F', \ - "format of Extended certificate (PEM or DER) PEM default " }, \ - { "xkeyform", OPT_X_KEYFORM, 'F', \ - "format of Extended certificate's key (PEM or DER) PEM default"} - -# define OPT_X_CASES \ - OPT_X__FIRST: case OPT_X__LAST: break; \ - case OPT_X_KEY: \ - case OPT_X_CERT: \ - case OPT_X_CHAIN: \ - case OPT_X_CHAIN_BUILD: \ - case OPT_X_CERTFORM: \ - case OPT_X_KEYFORM - -/* - * Common SSL options. - * Any changes here must be coordinated with ../ssl/ssl_conf.c - */ -# define OPT_S_ENUM \ - OPT_S__FIRST=3000, \ - OPT_S_NOSSL3, OPT_S_NOTLS1, OPT_S_NOTLS1_1, OPT_S_NOTLS1_2, \ - OPT_S_NOTLS1_3, OPT_S_BUGS, OPT_S_NO_COMP, OPT_S_NOTICKET, \ - OPT_S_SERVERPREF, OPT_S_LEGACYRENEG, OPT_S_LEGACYCONN, \ - OPT_S_ONRESUMP, OPT_S_NOLEGACYCONN, OPT_S_ALLOW_NO_DHE_KEX, \ - OPT_S_PRIORITIZE_CHACHA, \ - OPT_S_STRICT, OPT_S_SIGALGS, OPT_S_CLIENTSIGALGS, OPT_S_GROUPS, \ - OPT_S_CURVES, OPT_S_NAMEDCURVE, OPT_S_CIPHER, OPT_S_CIPHERSUITES, \ - OPT_S_RECORD_PADDING, OPT_S_DEBUGBROKE, OPT_S_COMP, \ - OPT_S_MINPROTO, OPT_S_MAXPROTO, \ - OPT_S_NO_RENEGOTIATION, OPT_S_NO_MIDDLEBOX, OPT_S__LAST - -# define OPT_S_OPTIONS \ - {"no_ssl3", OPT_S_NOSSL3, '-',"Just disable SSLv3" }, \ - {"no_tls1", OPT_S_NOTLS1, '-', "Just disable TLSv1"}, \ - {"no_tls1_1", OPT_S_NOTLS1_1, '-', "Just disable TLSv1.1" }, \ - {"no_tls1_2", OPT_S_NOTLS1_2, '-', "Just disable TLSv1.2"}, \ - {"no_tls1_3", OPT_S_NOTLS1_3, '-', "Just disable TLSv1.3"}, \ - {"bugs", OPT_S_BUGS, '-', "Turn on SSL bug compatibility"}, \ - {"no_comp", OPT_S_NO_COMP, '-', "Disable SSL/TLS compression (default)" }, \ - {"comp", OPT_S_COMP, '-', "Use SSL/TLS-level compression" }, \ - {"no_ticket", OPT_S_NOTICKET, '-', \ - "Disable use of TLS session tickets"}, \ - {"serverpref", OPT_S_SERVERPREF, '-', "Use server's cipher preferences"}, \ - {"legacy_renegotiation", OPT_S_LEGACYRENEG, '-', \ - "Enable use of legacy renegotiation (dangerous)"}, \ - {"no_renegotiation", OPT_S_NO_RENEGOTIATION, '-', \ - "Disable all renegotiation."}, \ - {"legacy_server_connect", OPT_S_LEGACYCONN, '-', \ - "Allow initial connection to servers that don't support RI"}, \ - {"no_resumption_on_reneg", OPT_S_ONRESUMP, '-', \ - "Disallow session resumption on renegotiation"}, \ - {"no_legacy_server_connect", OPT_S_NOLEGACYCONN, '-', \ - "Disallow initial connection to servers that don't support RI"}, \ - {"allow_no_dhe_kex", OPT_S_ALLOW_NO_DHE_KEX, '-', \ - "In TLSv1.3 allow non-(ec)dhe based key exchange on resumption"}, \ - {"prioritize_chacha", OPT_S_PRIORITIZE_CHACHA, '-', \ - "Prioritize ChaCha ciphers when preferred by clients"}, \ - {"strict", OPT_S_STRICT, '-', \ - "Enforce strict certificate checks as per TLS standard"}, \ - {"sigalgs", OPT_S_SIGALGS, 's', \ - "Signature algorithms to support (colon-separated list)" }, \ - {"client_sigalgs", OPT_S_CLIENTSIGALGS, 's', \ - "Signature algorithms to support for client certificate" \ - " authentication (colon-separated list)" }, \ - {"groups", OPT_S_GROUPS, 's', \ - "Groups to advertise (colon-separated list)" }, \ - {"curves", OPT_S_CURVES, 's', \ - "Groups to advertise (colon-separated list)" }, \ - {"named_curve", OPT_S_NAMEDCURVE, 's', \ - "Elliptic curve used for ECDHE (server-side only)" }, \ - {"cipher", OPT_S_CIPHER, 's', "Specify TLSv1.2 and below cipher list to be used"}, \ - {"ciphersuites", OPT_S_CIPHERSUITES, 's', "Specify TLSv1.3 ciphersuites to be used"}, \ - {"min_protocol", OPT_S_MINPROTO, 's', "Specify the minimum protocol version to be used"}, \ - {"max_protocol", OPT_S_MAXPROTO, 's', "Specify the maximum protocol version to be used"}, \ - {"record_padding", OPT_S_RECORD_PADDING, 's', \ - "Block size to pad TLS 1.3 records to."}, \ - {"debug_broken_protocol", OPT_S_DEBUGBROKE, '-', \ - "Perform all sorts of protocol violations for testing purposes"}, \ - {"no_middlebox", OPT_S_NO_MIDDLEBOX, '-', \ - "Disable TLSv1.3 middlebox compat mode" } - -# define OPT_S_CASES \ - OPT_S__FIRST: case OPT_S__LAST: break; \ - case OPT_S_NOSSL3: \ - case OPT_S_NOTLS1: \ - case OPT_S_NOTLS1_1: \ - case OPT_S_NOTLS1_2: \ - case OPT_S_NOTLS1_3: \ - case OPT_S_BUGS: \ - case OPT_S_NO_COMP: \ - case OPT_S_COMP: \ - case OPT_S_NOTICKET: \ - case OPT_S_SERVERPREF: \ - case OPT_S_LEGACYRENEG: \ - case OPT_S_LEGACYCONN: \ - case OPT_S_ONRESUMP: \ - case OPT_S_NOLEGACYCONN: \ - case OPT_S_ALLOW_NO_DHE_KEX: \ - case OPT_S_PRIORITIZE_CHACHA: \ - case OPT_S_STRICT: \ - case OPT_S_SIGALGS: \ - case OPT_S_CLIENTSIGALGS: \ - case OPT_S_GROUPS: \ - case OPT_S_CURVES: \ - case OPT_S_NAMEDCURVE: \ - case OPT_S_CIPHER: \ - case OPT_S_CIPHERSUITES: \ - case OPT_S_RECORD_PADDING: \ - case OPT_S_NO_RENEGOTIATION: \ - case OPT_S_MINPROTO: \ - case OPT_S_MAXPROTO: \ - case OPT_S_DEBUGBROKE: \ - case OPT_S_NO_MIDDLEBOX - -#define IS_NO_PROT_FLAG(o) \ - (o == OPT_S_NOSSL3 || o == OPT_S_NOTLS1 || o == OPT_S_NOTLS1_1 \ - || o == OPT_S_NOTLS1_2 || o == OPT_S_NOTLS1_3) - -/* - * Random state options. - */ -# define OPT_R_ENUM \ - OPT_R__FIRST=1500, OPT_R_RAND, OPT_R_WRITERAND, OPT_R__LAST - -# define OPT_R_OPTIONS \ - {"rand", OPT_R_RAND, 's', "Load the file(s) into the random number generator"}, \ - {"writerand", OPT_R_WRITERAND, '>', "Write random data to the specified file"} - -# define OPT_R_CASES \ - OPT_R__FIRST: case OPT_R__LAST: break; \ - case OPT_R_RAND: case OPT_R_WRITERAND - -/* - * Option parsing. - */ -extern const char OPT_HELP_STR[]; -extern const char OPT_MORE_STR[]; -typedef struct options_st { - const char *name; - int retval; - /* - * value type: - no value (also the value zero), n number, p positive - * number, u unsigned, l long, s string, < input file, > output file, - * f any format, F der/pem format, E der/pem/engine format identifier. - * l, n and u include zero; p does not. - */ - int valtype; - const char *helpstr; -} OPTIONS; - -/* - * A string/int pairing; widely use for option value lookup, hence the - * name OPT_PAIR. But that name is misleading in s_cb.c, so we also use - * the "generic" name STRINT_PAIR. - */ -typedef struct string_int_pair_st { - const char *name; - int retval; -} OPT_PAIR, STRINT_PAIR; - -/* Flags to pass into opt_format; see FORMAT_xxx, below. */ -# define OPT_FMT_PEMDER (1L << 1) -# define OPT_FMT_PKCS12 (1L << 2) -# define OPT_FMT_SMIME (1L << 3) -# define OPT_FMT_ENGINE (1L << 4) -# define OPT_FMT_MSBLOB (1L << 5) -/* (1L << 6) was OPT_FMT_NETSCAPE, but wasn't used */ -# define OPT_FMT_NSS (1L << 7) -# define OPT_FMT_TEXT (1L << 8) -# define OPT_FMT_HTTP (1L << 9) -# define OPT_FMT_PVK (1L << 10) -# define OPT_FMT_PDE (OPT_FMT_PEMDER | OPT_FMT_ENGINE) -# define OPT_FMT_PDS (OPT_FMT_PEMDER | OPT_FMT_SMIME) -# define OPT_FMT_ANY ( \ - OPT_FMT_PEMDER | OPT_FMT_PKCS12 | OPT_FMT_SMIME | \ - OPT_FMT_ENGINE | OPT_FMT_MSBLOB | OPT_FMT_NSS | \ - OPT_FMT_TEXT | OPT_FMT_HTTP | OPT_FMT_PVK) - -char *opt_progname(const char *argv0); -char *opt_getprog(void); -char *opt_init(int ac, char **av, const OPTIONS * o); -int opt_next(void); -int opt_format(const char *s, unsigned long flags, int *result); -int opt_int(const char *arg, int *result); -int opt_ulong(const char *arg, unsigned long *result); -int opt_long(const char *arg, long *result); -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \ - defined(INTMAX_MAX) && defined(UINTMAX_MAX) -int opt_imax(const char *arg, intmax_t *result); -int opt_umax(const char *arg, uintmax_t *result); -#else -# define opt_imax opt_long -# define opt_umax opt_ulong -# define intmax_t long -# define uintmax_t unsigned long -#endif -int opt_pair(const char *arg, const OPT_PAIR * pairs, int *result); -int opt_cipher(const char *name, const EVP_CIPHER **cipherp); -int opt_md(const char *name, const EVP_MD **mdp); -char *opt_arg(void); -char *opt_flag(void); -char *opt_unknown(void); -char **opt_rest(void); -int opt_num_rest(void); -int opt_verify(int i, X509_VERIFY_PARAM *vpm); -int opt_rand(int i); -void opt_help(const OPTIONS * list); -int opt_format_error(const char *s, unsigned long flags); - -typedef struct args_st { - int size; - int argc; - char **argv; -} ARGS; - -/* - * VMS C only for now, implemented in vms_decc_init.c - * If other C compilers forget to terminate argv with NULL, this function - * can be re-used. - */ -char **copy_argv(int *argc, char *argv[]); -/* - * Win32-specific argv initialization that splits OS-supplied UNICODE - * command line string to array of UTF8-encoded strings. - */ -void win32_utf8argv(int *argc, char **argv[]); - - -# define PW_MIN_LENGTH 4 -typedef struct pw_cb_data { - const void *password; - const char *prompt_info; -} PW_CB_DATA; - -int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_data); - -int setup_ui_method(void); -void destroy_ui_method(void); -const UI_METHOD *get_ui_method(void); - -int chopup_args(ARGS *arg, char *buf); -int dump_cert_text(BIO *out, X509 *x); -void print_name(BIO *out, const char *title, X509_NAME *nm, - unsigned long lflags); -void print_bignum_var(BIO *, const BIGNUM *, const char*, - int, unsigned char *); -void print_array(BIO *, const char *, int, const unsigned char *); -int set_nameopt(const char *arg); -unsigned long get_nameopt(void); -int set_cert_ex(unsigned long *flags, const char *arg); -int set_name_ex(unsigned long *flags, const char *arg); -int set_ext_copy(int *copy_type, const char *arg); -int copy_extensions(X509 *x, X509_REQ *req, int copy_type); -int app_passwd(const char *arg1, const char *arg2, char **pass1, char **pass2); -int add_oid_section(CONF *conf); -X509 *load_cert(const char *file, int format, const char *cert_descrip); -X509_CRL *load_crl(const char *infile, int format); -EVP_PKEY *load_key(const char *file, int format, int maybe_stdin, - const char *pass, ENGINE *e, const char *key_descrip); -EVP_PKEY *load_pubkey(const char *file, int format, int maybe_stdin, - const char *pass, ENGINE *e, const char *key_descrip); -int load_certs(const char *file, STACK_OF(X509) **certs, int format, - const char *pass, const char *cert_descrip); -int load_crls(const char *file, STACK_OF(X509_CRL) **crls, int format, - const char *pass, const char *cert_descrip); -X509_STORE *setup_verify(const char *CAfile, const char *CApath, - int noCAfile, int noCApath); -__owur int ctx_set_verify_locations(SSL_CTX *ctx, const char *CAfile, - const char *CApath, int noCAfile, - int noCApath); - -#ifndef OPENSSL_NO_CT - -/* - * Sets the file to load the Certificate Transparency log list from. - * If path is NULL, loads from the default file path. - * Returns 1 on success, 0 otherwise. - */ -__owur int ctx_set_ctlog_list_file(SSL_CTX *ctx, const char *path); - -#endif - -ENGINE *setup_engine(const char *engine, int debug); -void release_engine(ENGINE *e); - -# ifndef OPENSSL_NO_OCSP -OCSP_RESPONSE *process_responder(OCSP_REQUEST *req, - const char *host, const char *path, - const char *port, int use_ssl, - STACK_OF(CONF_VALUE) *headers, - int req_timeout); -# endif - -/* Functions defined in ca.c and also used in ocsp.c */ -int unpack_revinfo(ASN1_TIME **prevtm, int *preason, ASN1_OBJECT **phold, - 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' /* Revoked */ -# define DB_TYPE_EXP 'E' /* Expired */ -# define DB_TYPE_VAL 'V' /* Valid ; inserted with: ca ... -valid */ -# define DB_TYPE_SUSP 'S' /* Suspended */ - -typedef struct db_attr_st { - int unique_subject; -} DB_ATTR; -typedef struct ca_db_st { - DB_ATTR attributes; - TXT_DB *db; - char *dbfname; -# ifndef OPENSSL_NO_POSIX_IO - struct stat dbst; -# endif -} CA_DB; - -void* app_malloc(int sz, const char *what); -BIGNUM *load_serial(const char *serialfile, int create, ASN1_INTEGER **retai); -int save_serial(const char *serialfile, const char *suffix, const BIGNUM *serial, - ASN1_INTEGER **retai); -int rotate_serial(const char *serialfile, const char *new_suffix, - const char *old_suffix); -int rand_serial(BIGNUM *b, ASN1_INTEGER *ai); -CA_DB *load_index(const char *dbfile, DB_ATTR *dbattr); -int index_index(CA_DB *db); -int save_index(const char *dbfile, const char *suffix, CA_DB *db); -int rotate_index(const char *dbfile, const char *new_suffix, - const char *old_suffix); -void free_index(CA_DB *db); -# 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)) -int index_name_cmp(const OPENSSL_CSTRING *a, const OPENSSL_CSTRING *b); -int parse_yesno(const char *str, int def); - -X509_NAME *parse_name(const char *str, long chtype, int multirdn); -void policies_print(X509_STORE_CTX *ctx); -int bio_to_mem(unsigned char **out, int maxlen, BIO *in); -int pkey_ctrl_string(EVP_PKEY_CTX *ctx, const char *value); -int init_gen_str(EVP_PKEY_CTX **pctx, - const char *algname, ENGINE *e, int do_param); -int do_X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts); -int do_X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts); -int do_X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts); - -extern char *psk_key; - - -unsigned char *next_protos_parse(size_t *outlen, const char *in); - -void print_cert_checks(BIO *bio, X509 *x, - const char *checkhost, - const char *checkemail, const char *checkip); - -void store_setup_crl_download(X509_STORE *st); - -/* See OPT_FMT_xxx, above. */ -/* On some platforms, it's important to distinguish between text and binary - * files. On some, there might even be specific file formats for different - * contents. The FORMAT_xxx macros are meant to express an intent with the - * file being read or created. - */ -# define B_FORMAT_TEXT 0x8000 -# define FORMAT_UNDEF 0 -# define FORMAT_TEXT (1 | B_FORMAT_TEXT) /* Generic text */ -# define FORMAT_BINARY 2 /* Generic binary */ -# define FORMAT_BASE64 (3 | B_FORMAT_TEXT) /* Base64 */ -# define FORMAT_ASN1 4 /* ASN.1/DER */ -# define FORMAT_PEM (5 | B_FORMAT_TEXT) -# define FORMAT_PKCS12 6 -# define FORMAT_SMIME (7 | B_FORMAT_TEXT) -# define FORMAT_ENGINE 8 /* Not really a file format */ -# define FORMAT_PEMRSA (9 | B_FORMAT_TEXT) /* 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 - -/* - * IETF RFC 5280 says serial number must be <= 20 bytes. Use 159 bits - * so that the first bit will never be one, so that the DER encoding - * rules won't force a leading octet. - */ -# define SERIAL_RAND_BITS 159 - -int app_isdir(const char *); -int app_access(const char *, int flag); -int fileno_stdin(void); -int fileno_stdout(void); -int raw_read_stdin(void *, int); -int raw_write_stdout(const void *, int); - -# define TM_START 0 -# define TM_STOP 1 -double app_tminterval(int stop, int usertime); - -void make_uppercase(char *string); - -typedef struct verify_options_st { - int depth; - int quiet; - int error; - int return_error; -} VERIFY_CB_ARGS; - -extern VERIFY_CB_ARGS verify_args; - -#endif diff --git a/contrib/libs/openssl/apps/asn1pars.c b/contrib/libs/openssl/apps/asn1pars.c deleted file mode 100644 index 6c44df7de4..0000000000 --- a/contrib/libs/openssl/apps/asn1pars.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/asn1t.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_IN, OPT_OUT, OPT_INDENT, OPT_NOOUT, - OPT_OID, OPT_OFFSET, OPT_LENGTH, OPT_DUMP, OPT_DLIMIT, - OPT_STRPARSE, OPT_GENSTR, OPT_GENCONF, OPT_STRICTPEM, - OPT_ITEM -} OPTION_CHOICE; - -const OPTIONS asn1parse_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "input format - one of DER PEM"}, - {"in", OPT_IN, '<', "input file"}, - {"out", OPT_OUT, '>', "output file (output format is always DER)"}, - {"i", OPT_INDENT, 0, "indents the output"}, - {"noout", OPT_NOOUT, 0, "do not produce any output"}, - {"offset", OPT_OFFSET, 'p', "offset into file"}, - {"length", OPT_LENGTH, 'p', "length of section in file"}, - {"oid", OPT_OID, '<', "file of extra oid definitions"}, - {"dump", OPT_DUMP, 0, "unknown data in hex form"}, - {"dlimit", OPT_DLIMIT, 'p', - "dump the first arg bytes of unknown data in hex form"}, - {"strparse", OPT_STRPARSE, 'p', - "offset; a series of these can be used to 'dig'"}, - {OPT_MORE_STR, 0, 0, "into multiple ASN1 blob wrappings"}, - {"genstr", OPT_GENSTR, 's', "string to generate ASN1 structure from"}, - {"genconf", OPT_GENCONF, 's', "file to generate ASN1 structure from"}, - {OPT_MORE_STR, 0, 0, "(-inform will be ignored)"}, - {"strictpem", OPT_STRICTPEM, 0, - "do not attempt base64 decode outside PEM markers"}, - {"item", OPT_ITEM, 's', "item to parse and print"}, - {NULL} -}; - -static int do_generate(char *genstr, const char *genconf, BUF_MEM *buf); - -int asn1parse_main(int argc, char **argv) -{ - ASN1_TYPE *at = NULL; - BIO *in = NULL, *b64 = NULL, *derout = NULL; - BUF_MEM *buf = NULL; - STACK_OF(OPENSSL_STRING) *osk = NULL; - char *genstr = NULL, *genconf = NULL; - char *infile = NULL, *oidfile = NULL, *derfile = NULL; - unsigned char *str = NULL; - char *name = NULL, *header = NULL, *prog; - const unsigned char *ctmpbuf; - int indent = 0, noout = 0, dump = 0, strictpem = 0, informat = FORMAT_PEM; - int offset = 0, ret = 1, i, j; - long num, tmplen; - unsigned char *tmpbuf; - unsigned int length = 0; - OPTION_CHOICE o; - const ASN1_ITEM *it = NULL; - - prog = opt_init(argc, argv, asn1parse_options); - - if ((osk = sk_OPENSSL_STRING_new_null()) == NULL) { - BIO_printf(bio_err, "%s: Memory allocation failure\n", prog); - goto end; - } - - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(asn1parse_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - derfile = opt_arg(); - break; - case OPT_INDENT: - indent = 1; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_OID: - oidfile = opt_arg(); - break; - case OPT_OFFSET: - offset = strtol(opt_arg(), NULL, 0); - break; - case OPT_LENGTH: - length = strtol(opt_arg(), NULL, 0); - break; - case OPT_DUMP: - dump = -1; - break; - case OPT_DLIMIT: - dump = strtol(opt_arg(), NULL, 0); - break; - case OPT_STRPARSE: - sk_OPENSSL_STRING_push(osk, opt_arg()); - break; - case OPT_GENSTR: - genstr = opt_arg(); - break; - case OPT_GENCONF: - genconf = opt_arg(); - break; - case OPT_STRICTPEM: - strictpem = 1; - informat = FORMAT_PEM; - break; - case OPT_ITEM: - it = ASN1_ITEM_lookup(opt_arg()); - if (it == NULL) { - size_t tmp; - - BIO_printf(bio_err, "Unknown item name %s\n", opt_arg()); - BIO_puts(bio_err, "Supported types:\n"); - for (tmp = 0;; tmp++) { - it = ASN1_ITEM_get(tmp); - if (it == NULL) - break; - BIO_printf(bio_err, " %s\n", it->sname); - } - goto end; - } - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (oidfile != NULL) { - in = bio_open_default(oidfile, 'r', FORMAT_TEXT); - if (in == NULL) - goto end; - OBJ_create_objects(in); - BIO_free(in); - } - - if ((in = bio_open_default(infile, 'r', informat)) == NULL) - goto end; - - if (derfile && (derout = bio_open_default(derfile, 'w', FORMAT_ASN1)) == NULL) - goto end; - - if ((buf = BUF_MEM_new()) == NULL) - goto end; - if (strictpem) { - if (PEM_read_bio(in, &name, &header, &str, &num) != 1) { - BIO_printf(bio_err, "Error reading PEM file\n"); - ERR_print_errors(bio_err); - goto end; - } - buf->data = (char *)str; - buf->length = buf->max = num; - } else { - if (!BUF_MEM_grow(buf, BUFSIZ * 8)) - goto end; /* Pre-allocate :-) */ - - if (genstr || genconf) { - num = do_generate(genstr, genconf, buf); - if (num < 0) { - ERR_print_errors(bio_err); - goto end; - } - } else { - - if (informat == FORMAT_PEM) { - BIO *tmp; - - if ((b64 = BIO_new(BIO_f_base64())) == NULL) - goto end; - BIO_push(b64, in); - tmp = in; - in = b64; - b64 = tmp; - } - - num = 0; - for (;;) { - if (!BUF_MEM_grow(buf, num + BUFSIZ)) - goto end; - i = BIO_read(in, &(buf->data[num]), BUFSIZ); - if (i <= 0) - break; - num += i; - } - } - str = (unsigned char *)buf->data; - - } - - /* If any structs to parse go through in sequence */ - - if (sk_OPENSSL_STRING_num(osk)) { - tmpbuf = str; - tmplen = num; - for (i = 0; i < sk_OPENSSL_STRING_num(osk); i++) { - ASN1_TYPE *atmp; - int typ; - j = strtol(sk_OPENSSL_STRING_value(osk, i), NULL, 0); - if (j <= 0 || j >= tmplen) { - BIO_printf(bio_err, "'%s' is out of range\n", - sk_OPENSSL_STRING_value(osk, i)); - continue; - } - tmpbuf += j; - tmplen -= j; - atmp = at; - ctmpbuf = tmpbuf; - at = d2i_ASN1_TYPE(NULL, &ctmpbuf, tmplen); - ASN1_TYPE_free(atmp); - if (!at) { - BIO_printf(bio_err, "Error parsing structure\n"); - ERR_print_errors(bio_err); - goto end; - } - typ = ASN1_TYPE_get(at); - if ((typ == V_ASN1_OBJECT) - || (typ == V_ASN1_BOOLEAN) - || (typ == V_ASN1_NULL)) { - BIO_printf(bio_err, "Can't parse %s type\n", ASN1_tag2str(typ)); - ERR_print_errors(bio_err); - goto end; - } - /* hmm... this is a little evil but it works */ - tmpbuf = at->value.asn1_string->data; - tmplen = at->value.asn1_string->length; - } - str = tmpbuf; - num = tmplen; - } - - if (offset < 0 || offset >= num) { - BIO_printf(bio_err, "Error: offset out of range\n"); - goto end; - } - - num -= offset; - - if (length == 0 || length > (unsigned int)num) - length = (unsigned int)num; - if (derout != NULL) { - if (BIO_write(derout, str + offset, length) != (int)length) { - BIO_printf(bio_err, "Error writing output\n"); - ERR_print_errors(bio_err); - goto end; - } - } - if (!noout) { - const unsigned char *p = str + offset; - - if (it != NULL) { - ASN1_VALUE *value = ASN1_item_d2i(NULL, &p, length, it); - if (value == NULL) { - BIO_printf(bio_err, "Error parsing item %s\n", it->sname); - ERR_print_errors(bio_err); - goto end; - } - ASN1_item_print(bio_out, value, 0, it, NULL); - ASN1_item_free(value, it); - } else { - if (!ASN1_parse_dump(bio_out, p, length, indent, dump)) { - ERR_print_errors(bio_err); - goto end; - } - } - } - ret = 0; - end: - BIO_free(derout); - BIO_free(in); - BIO_free(b64); - if (ret != 0) - ERR_print_errors(bio_err); - BUF_MEM_free(buf); - OPENSSL_free(name); - OPENSSL_free(header); - ASN1_TYPE_free(at); - sk_OPENSSL_STRING_free(osk); - return ret; -} - -static int do_generate(char *genstr, const char *genconf, BUF_MEM *buf) -{ - CONF *cnf = NULL; - int len; - unsigned char *p; - ASN1_TYPE *atyp = NULL; - - if (genconf != NULL) { - if ((cnf = app_load_config(genconf)) == NULL) - goto err; - if (genstr == NULL) - genstr = NCONF_get_string(cnf, "default", "asn1"); - if (genstr == NULL) { - BIO_printf(bio_err, "Can't find 'asn1' in '%s'\n", genconf); - goto err; - } - } - - atyp = ASN1_generate_nconf(genstr, cnf); - NCONF_free(cnf); - cnf = NULL; - - if (atyp == NULL) - return -1; - - len = i2d_ASN1_TYPE(atyp, NULL); - - if (len <= 0) - goto err; - - if (!BUF_MEM_grow(buf, len)) - goto err; - - p = (unsigned char *)buf->data; - - i2d_ASN1_TYPE(atyp, &p); - - ASN1_TYPE_free(atyp); - return len; - - err: - NCONF_free(cnf); - ASN1_TYPE_free(atyp); - return -1; -} diff --git a/contrib/libs/openssl/apps/bf_prefix.c b/contrib/libs/openssl/apps/bf_prefix.c deleted file mode 100644 index bae3c91bf8..0000000000 --- a/contrib/libs/openssl/apps/bf_prefix.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <openssl/bio.h> -#include "apps.h" - -static int prefix_write(BIO *b, const char *out, size_t outl, - size_t *numwritten); -static int prefix_read(BIO *b, char *buf, size_t size, size_t *numread); -static int prefix_puts(BIO *b, const char *str); -static int prefix_gets(BIO *b, char *str, int size); -static long prefix_ctrl(BIO *b, int cmd, long arg1, void *arg2); -static int prefix_create(BIO *b); -static int prefix_destroy(BIO *b); -static long prefix_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp); - -static BIO_METHOD *prefix_meth = NULL; - -BIO_METHOD *apps_bf_prefix(void) -{ - if (prefix_meth == NULL) { - if ((prefix_meth = - BIO_meth_new(BIO_TYPE_FILTER, "Prefix filter")) == NULL - || !BIO_meth_set_create(prefix_meth, prefix_create) - || !BIO_meth_set_destroy(prefix_meth, prefix_destroy) - || !BIO_meth_set_write_ex(prefix_meth, prefix_write) - || !BIO_meth_set_read_ex(prefix_meth, prefix_read) - || !BIO_meth_set_puts(prefix_meth, prefix_puts) - || !BIO_meth_set_gets(prefix_meth, prefix_gets) - || !BIO_meth_set_ctrl(prefix_meth, prefix_ctrl) - || !BIO_meth_set_callback_ctrl(prefix_meth, prefix_callback_ctrl)) { - BIO_meth_free(prefix_meth); - prefix_meth = NULL; - } - } - return prefix_meth; -} - -typedef struct prefix_ctx_st { - char *prefix; - int linestart; /* flag to indicate we're at the line start */ -} PREFIX_CTX; - -static int prefix_create(BIO *b) -{ - PREFIX_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); - - if (ctx == NULL) - return 0; - - ctx->prefix = NULL; - ctx->linestart = 1; - BIO_set_data(b, ctx); - BIO_set_init(b, 1); - return 1; -} - -static int prefix_destroy(BIO *b) -{ - PREFIX_CTX *ctx = BIO_get_data(b); - - OPENSSL_free(ctx->prefix); - OPENSSL_free(ctx); - return 1; -} - -static int prefix_read(BIO *b, char *in, size_t size, size_t *numread) -{ - return BIO_read_ex(BIO_next(b), in, size, numread); -} - -static int prefix_write(BIO *b, const char *out, size_t outl, - size_t *numwritten) -{ - PREFIX_CTX *ctx = BIO_get_data(b); - - if (ctx == NULL) - return 0; - - /* If no prefix is set or if it's empty, we've got nothing to do here */ - if (ctx->prefix == NULL || *ctx->prefix == '\0') { - /* We do note if what comes next will be a new line, though */ - if (outl > 0) - ctx->linestart = (out[outl-1] == '\n'); - return BIO_write_ex(BIO_next(b), out, outl, numwritten); - } - - *numwritten = 0; - - while (outl > 0) { - size_t i; - char c; - - /* If we know that we're at the start of the line, output the prefix */ - if (ctx->linestart) { - size_t dontcare; - - if (!BIO_write_ex(BIO_next(b), ctx->prefix, strlen(ctx->prefix), - &dontcare)) - return 0; - ctx->linestart = 0; - } - - /* Now, go look for the next LF, or the end of the string */ - for (i = 0, c = '\0'; i < outl && (c = out[i]) != '\n'; i++) - continue; - if (c == '\n') - i++; - - /* Output what we found so far */ - while (i > 0) { - size_t num = 0; - - if (!BIO_write_ex(BIO_next(b), out, i, &num)) - return 0; - out += num; - outl -= num; - *numwritten += num; - i -= num; - } - - /* If we found a LF, what follows is a new line, so take note */ - if (c == '\n') - ctx->linestart = 1; - } - - return 1; -} - -static long prefix_ctrl(BIO *b, int cmd, long num, void *ptr) -{ - long ret = 0; - - switch (cmd) { - case PREFIX_CTRL_SET_PREFIX: - { - PREFIX_CTX *ctx = BIO_get_data(b); - - if (ctx == NULL) - break; - - OPENSSL_free(ctx->prefix); - ctx->prefix = OPENSSL_strdup((const char *)ptr); - ret = ctx->prefix != NULL; - } - break; - default: - if (BIO_next(b) != NULL) - ret = BIO_ctrl(BIO_next(b), cmd, num, ptr); - break; - } - return ret; -} - -static long prefix_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp) -{ - return BIO_callback_ctrl(BIO_next(b), cmd, fp); -} - -static int prefix_gets(BIO *b, char *buf, int size) -{ - return BIO_gets(BIO_next(b), buf, size); -} - -static int prefix_puts(BIO *b, const char *str) -{ - return BIO_write(b, str, strlen(str)); -} diff --git a/contrib/libs/openssl/apps/ca.c b/contrib/libs/openssl/apps/ca.c deleted file mode 100644 index 390ac37493..0000000000 --- a/contrib/libs/openssl/apps/ca.c +++ /dev/null @@ -1,2595 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <sys/types.h> -#include <openssl/conf.h> -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/txt_db.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/objects.h> -#include <openssl/ocsp.h> -#include <openssl/pem.h> - -#ifndef W_OK -# ifdef OPENSSL_SYS_VMS -# include <unistd.h> -# elif !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_WINDOWS) -# include <sys/file.h> -# endif -#endif - -#include "apps.h" -#include "progs.h" - -#ifndef W_OK -# define F_OK 0 -# define W_OK 2 -# define R_OK 4 -#endif - -#ifndef PATH_MAX -# define PATH_MAX 4096 -#endif - -#define BASE_SECTION "ca" - -#define ENV_DEFAULT_CA "default_ca" - -#define STRING_MASK "string_mask" -#define UTF8_IN "utf8" - -#define ENV_NEW_CERTS_DIR "new_certs_dir" -#define ENV_CERTIFICATE "certificate" -#define ENV_SERIAL "serial" -#define ENV_RAND_SERIAL "rand_serial" -#define ENV_CRLNUMBER "crlnumber" -#define ENV_PRIVATE_KEY "private_key" -#define ENV_DEFAULT_DAYS "default_days" -#define ENV_DEFAULT_STARTDATE "default_startdate" -#define ENV_DEFAULT_ENDDATE "default_enddate" -#define ENV_DEFAULT_CRL_DAYS "default_crl_days" -#define ENV_DEFAULT_CRL_HOURS "default_crl_hours" -#define ENV_DEFAULT_MD "default_md" -#define ENV_DEFAULT_EMAIL_DN "email_in_dn" -#define ENV_PRESERVE "preserve" -#define ENV_POLICY "policy" -#define ENV_EXTENSIONS "x509_extensions" -#define ENV_CRLEXT "crl_extensions" -#define ENV_MSIE_HACK "msie_hack" -#define ENV_NAMEOPT "name_opt" -#define ENV_CERTOPT "cert_opt" -#define ENV_EXTCOPY "copy_extensions" -#define ENV_UNIQUE_SUBJECT "unique_subject" - -#define ENV_DATABASE "database" - -/* Additional revocation information types */ -typedef enum { - REV_VALID = -1, /* Valid (not-revoked) status */ - REV_NONE = 0, /* No additional information */ - REV_CRL_REASON = 1, /* Value is CRL reason code */ - REV_HOLD = 2, /* Value is hold instruction */ - REV_KEY_COMPROMISE = 3, /* Value is cert key compromise time */ - REV_CA_COMPROMISE = 4 /* Value is CA key compromise time */ -} REVINFO_TYPE; - -static char *lookup_conf(const CONF *conf, const char *group, const char *tag); - -static int certify(X509 **xret, const char *infile, EVP_PKEY *pkey, X509 *x509, - const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, - BIGNUM *serial, const char *subj, unsigned long chtype, - int multirdn, int email_dn, const char *startdate, - const char *enddate, - long days, int batch, const char *ext_sect, CONF *conf, - int verbose, unsigned long certopt, unsigned long nameopt, - int default_op, int ext_copy, int selfsign); -static int certify_cert(X509 **xret, const char *infile, EVP_PKEY *pkey, X509 *x509, - const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, - BIGNUM *serial, const char *subj, unsigned long chtype, - int multirdn, int email_dn, const char *startdate, - const char *enddate, long days, int batch, const char *ext_sect, - CONF *conf, int verbose, unsigned long certopt, - unsigned long nameopt, int default_op, int ext_copy); -static int certify_spkac(X509 **xret, const char *infile, EVP_PKEY *pkey, - X509 *x509, const EVP_MD *dgst, - STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, - BIGNUM *serial, const char *subj, unsigned long chtype, - int multirdn, int email_dn, const char *startdate, - const char *enddate, long days, const char *ext_sect, CONF *conf, - int verbose, unsigned long certopt, - unsigned long nameopt, int default_op, int ext_copy); -static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, - const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, BIGNUM *serial, - const char *subj, unsigned long chtype, int multirdn, - int email_dn, const char *startdate, const char *enddate, long days, - int batch, int verbose, X509_REQ *req, const char *ext_sect, - CONF *conf, unsigned long certopt, unsigned long nameopt, - int default_op, int ext_copy, int selfsign); -static int get_certificate_status(const char *ser_status, CA_DB *db); -static int do_updatedb(CA_DB *db); -static int check_time_format(const char *str); -static int do_revoke(X509 *x509, CA_DB *db, REVINFO_TYPE rev_type, - const char *extval); -static char *make_revocation_str(REVINFO_TYPE rev_type, const char *rev_arg); -static int make_revoked(X509_REVOKED *rev, const char *str); -static int old_entry_print(const ASN1_OBJECT *obj, const ASN1_STRING *str); -static void write_new_certificate(BIO *bp, X509 *x, int output_der, int notext); - -static CONF *extconf = NULL; -static int preserve = 0; -static int msie_hack = 0; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENGINE, OPT_VERBOSE, OPT_CONFIG, OPT_NAME, OPT_SUBJ, OPT_UTF8, - OPT_CREATE_SERIAL, OPT_MULTIVALUE_RDN, OPT_STARTDATE, OPT_ENDDATE, - OPT_DAYS, OPT_MD, OPT_POLICY, OPT_KEYFILE, OPT_KEYFORM, OPT_PASSIN, - OPT_KEY, OPT_CERT, OPT_SELFSIGN, OPT_IN, OPT_OUT, OPT_OUTDIR, - OPT_SIGOPT, OPT_NOTEXT, OPT_BATCH, OPT_PRESERVEDN, OPT_NOEMAILDN, - OPT_GENCRL, OPT_MSIE_HACK, OPT_CRLDAYS, OPT_CRLHOURS, OPT_CRLSEC, - OPT_INFILES, OPT_SS_CERT, OPT_SPKAC, OPT_REVOKE, OPT_VALID, - OPT_EXTENSIONS, OPT_EXTFILE, OPT_STATUS, OPT_UPDATEDB, OPT_CRLEXTS, - OPT_RAND_SERIAL, - OPT_R_ENUM, - /* Do not change the order here; see related case statements below */ - OPT_CRL_REASON, OPT_CRL_HOLD, OPT_CRL_COMPROMISE, OPT_CRL_CA_COMPROMISE -} OPTION_CHOICE; - -const OPTIONS ca_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"verbose", OPT_VERBOSE, '-', "Verbose output during processing"}, - {"config", OPT_CONFIG, 's', "A config file"}, - {"name", OPT_NAME, 's', "The particular CA definition to use"}, - {"subj", OPT_SUBJ, 's', "Use arg instead of request's subject"}, - {"utf8", OPT_UTF8, '-', "Input characters are UTF8 (default ASCII)"}, - {"create_serial", OPT_CREATE_SERIAL, '-', - "If reading serial fails, create a new random serial"}, - {"rand_serial", OPT_RAND_SERIAL, '-', - "Always create a random serial; do not store it"}, - {"multivalue-rdn", OPT_MULTIVALUE_RDN, '-', - "Enable support for multivalued RDNs"}, - {"startdate", OPT_STARTDATE, 's', "Cert notBefore, YYMMDDHHMMSSZ"}, - {"enddate", OPT_ENDDATE, 's', - "YYMMDDHHMMSSZ cert notAfter (overrides -days)"}, - {"days", OPT_DAYS, 'p', "Number of days to certify the cert for"}, - {"md", OPT_MD, 's', "md to use; one of md2, md5, sha or sha1"}, - {"policy", OPT_POLICY, 's', "The CA 'policy' to support"}, - {"keyfile", OPT_KEYFILE, 's', "Private key"}, - {"keyform", OPT_KEYFORM, 'f', "Private key file format (PEM or ENGINE)"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"key", OPT_KEY, 's', "Key to decode the private key if it is encrypted"}, - {"cert", OPT_CERT, '<', "The CA cert"}, - {"selfsign", OPT_SELFSIGN, '-', - "Sign a cert with the key associated with it"}, - {"in", OPT_IN, '<', "The input PEM encoded cert request(s)"}, - {"out", OPT_OUT, '>', "Where to put the output file(s)"}, - {"outdir", OPT_OUTDIR, '/', "Where to put output cert"}, - {"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"}, - {"notext", OPT_NOTEXT, '-', "Do not print the generated certificate"}, - {"batch", OPT_BATCH, '-', "Don't ask questions"}, - {"preserveDN", OPT_PRESERVEDN, '-', "Don't re-order the DN"}, - {"noemailDN", OPT_NOEMAILDN, '-', "Don't add the EMAIL field to the DN"}, - {"gencrl", OPT_GENCRL, '-', "Generate a new CRL"}, - {"msie_hack", OPT_MSIE_HACK, '-', - "msie modifications to handle all those universal strings"}, - {"crldays", OPT_CRLDAYS, 'p', "Days until the next CRL is due"}, - {"crlhours", OPT_CRLHOURS, 'p', "Hours until the next CRL is due"}, - {"crlsec", OPT_CRLSEC, 'p', "Seconds until the next CRL is due"}, - {"infiles", OPT_INFILES, '-', "The last argument, requests to process"}, - {"ss_cert", OPT_SS_CERT, '<', "File contains a self signed cert to sign"}, - {"spkac", OPT_SPKAC, '<', - "File contains DN and signed public key and challenge"}, - {"revoke", OPT_REVOKE, '<', "Revoke a cert (given in file)"}, - {"valid", OPT_VALID, 's', - "Add a Valid(not-revoked) DB entry about a cert (given in file)"}, - {"extensions", OPT_EXTENSIONS, 's', - "Extension section (override value in config file)"}, - {"extfile", OPT_EXTFILE, '<', - "Configuration file with X509v3 extensions to add"}, - {"status", OPT_STATUS, 's', "Shows cert status given the serial number"}, - {"updatedb", OPT_UPDATEDB, '-', "Updates db for expired cert"}, - {"crlexts", OPT_CRLEXTS, 's', - "CRL extension section (override value in config file)"}, - {"crl_reason", OPT_CRL_REASON, 's', "revocation reason"}, - {"crl_hold", OPT_CRL_HOLD, 's', - "the hold instruction, an OID. Sets revocation reason to certificateHold"}, - {"crl_compromise", OPT_CRL_COMPROMISE, 's', - "sets compromise time to val and the revocation reason to keyCompromise"}, - {"crl_CA_compromise", OPT_CRL_CA_COMPROMISE, 's', - "sets compromise time to val and the revocation reason to CACompromise"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int ca_main(int argc, char **argv) -{ - CONF *conf = NULL; - ENGINE *e = NULL; - BIGNUM *crlnumber = NULL, *serial = NULL; - EVP_PKEY *pkey = NULL; - BIO *in = NULL, *out = NULL, *Sout = NULL; - ASN1_INTEGER *tmpser; - ASN1_TIME *tmptm; - CA_DB *db = NULL; - DB_ATTR db_attr; - STACK_OF(CONF_VALUE) *attribs = NULL; - STACK_OF(OPENSSL_STRING) *sigopts = NULL; - STACK_OF(X509) *cert_sk = NULL; - X509_CRL *crl = NULL; - const EVP_MD *dgst = NULL; - char *configfile = default_config_file, *section = NULL; - char *md = NULL, *policy = NULL, *keyfile = NULL; - char *certfile = NULL, *crl_ext = NULL, *crlnumberfile = NULL, *key = NULL; - const char *infile = NULL, *spkac_file = NULL, *ss_cert_file = NULL; - const char *extensions = NULL, *extfile = NULL, *passinarg = NULL; - char *outdir = NULL, *outfile = NULL, *rev_arg = NULL, *ser_status = NULL; - const char *serialfile = NULL, *subj = NULL; - char *prog, *startdate = NULL, *enddate = NULL; - char *dbfile = NULL, *f; - char new_cert[PATH_MAX]; - char tmp[10 + 1] = "\0"; - char *const *pp; - const char *p; - size_t outdirlen = 0; - int create_ser = 0, free_key = 0, total = 0, total_done = 0; - int batch = 0, default_op = 1, doupdatedb = 0, ext_copy = EXT_COPY_NONE; - int keyformat = FORMAT_PEM, multirdn = 0, notext = 0, output_der = 0; - int ret = 1, email_dn = 1, req = 0, verbose = 0, gencrl = 0, dorevoke = 0; - int rand_ser = 0, i, j, selfsign = 0, def_nid, def_ret; - long crldays = 0, crlhours = 0, crlsec = 0, days = 0; - unsigned long chtype = MBSTRING_ASC, certopt = 0; - X509 *x509 = NULL, *x509p = NULL, *x = NULL; - REVINFO_TYPE rev_type = REV_NONE; - X509_REVOKED *r = NULL; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, ca_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: -opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(ca_options); - ret = 0; - goto end; - case OPT_IN: - req = 1; - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_VERBOSE: - verbose = 1; - break; - case OPT_CONFIG: - configfile = opt_arg(); - break; - case OPT_NAME: - section = opt_arg(); - break; - case OPT_SUBJ: - subj = opt_arg(); - /* preserve=1; */ - break; - case OPT_UTF8: - chtype = MBSTRING_UTF8; - break; - case OPT_RAND_SERIAL: - rand_ser = 1; - break; - case OPT_CREATE_SERIAL: - create_ser = 1; - break; - case OPT_MULTIVALUE_RDN: - multirdn = 1; - break; - case OPT_STARTDATE: - startdate = opt_arg(); - break; - case OPT_ENDDATE: - enddate = opt_arg(); - break; - case OPT_DAYS: - days = atoi(opt_arg()); - break; - case OPT_MD: - md = opt_arg(); - break; - case OPT_POLICY: - policy = opt_arg(); - break; - case OPT_KEYFILE: - keyfile = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyformat)) - goto opthelp; - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_KEY: - key = opt_arg(); - break; - case OPT_CERT: - certfile = opt_arg(); - break; - case OPT_SELFSIGN: - selfsign = 1; - break; - case OPT_OUTDIR: - outdir = opt_arg(); - break; - case OPT_SIGOPT: - if (sigopts == NULL) - sigopts = sk_OPENSSL_STRING_new_null(); - if (sigopts == NULL || !sk_OPENSSL_STRING_push(sigopts, opt_arg())) - goto end; - break; - case OPT_NOTEXT: - notext = 1; - break; - case OPT_BATCH: - batch = 1; - break; - case OPT_PRESERVEDN: - preserve = 1; - break; - case OPT_NOEMAILDN: - email_dn = 0; - break; - case OPT_GENCRL: - gencrl = 1; - break; - case OPT_MSIE_HACK: - msie_hack = 1; - break; - case OPT_CRLDAYS: - crldays = atol(opt_arg()); - break; - case OPT_CRLHOURS: - crlhours = atol(opt_arg()); - break; - case OPT_CRLSEC: - crlsec = atol(opt_arg()); - break; - case OPT_INFILES: - req = 1; - goto end_of_options; - case OPT_SS_CERT: - ss_cert_file = opt_arg(); - req = 1; - break; - case OPT_SPKAC: - spkac_file = opt_arg(); - req = 1; - break; - case OPT_REVOKE: - infile = opt_arg(); - dorevoke = 1; - break; - case OPT_VALID: - infile = opt_arg(); - dorevoke = 2; - break; - case OPT_EXTENSIONS: - extensions = opt_arg(); - break; - case OPT_EXTFILE: - extfile = opt_arg(); - break; - case OPT_STATUS: - ser_status = opt_arg(); - break; - case OPT_UPDATEDB: - doupdatedb = 1; - break; - case OPT_CRLEXTS: - crl_ext = opt_arg(); - break; - case OPT_CRL_REASON: /* := REV_CRL_REASON */ - case OPT_CRL_HOLD: - case OPT_CRL_COMPROMISE: - case OPT_CRL_CA_COMPROMISE: - rev_arg = opt_arg(); - rev_type = (o - OPT_CRL_REASON) + REV_CRL_REASON; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - } - } -end_of_options: - argc = opt_num_rest(); - argv = opt_rest(); - - BIO_printf(bio_err, "Using configuration from %s\n", configfile); - - if ((conf = app_load_config(configfile)) == NULL) - goto end; - if (configfile != default_config_file && !app_load_modules(conf)) - goto end; - - /* Lets get the config section we are using */ - if (section == NULL - && (section = lookup_conf(conf, BASE_SECTION, ENV_DEFAULT_CA)) == NULL) - goto end; - - p = NCONF_get_string(conf, NULL, "oid_file"); - if (p == NULL) - ERR_clear_error(); - if (p != NULL) { - BIO *oid_bio = BIO_new_file(p, "r"); - - if (oid_bio == NULL) { - ERR_clear_error(); - } else { - OBJ_create_objects(oid_bio); - BIO_free(oid_bio); - } - } - if (!add_oid_section(conf)) { - ERR_print_errors(bio_err); - goto end; - } - - app_RAND_load_conf(conf, BASE_SECTION); - - f = NCONF_get_string(conf, section, STRING_MASK); - if (f == NULL) - ERR_clear_error(); - - if (f != NULL && !ASN1_STRING_set_default_mask_asc(f)) { - BIO_printf(bio_err, "Invalid global string mask setting %s\n", f); - goto end; - } - - if (chtype != MBSTRING_UTF8) { - f = NCONF_get_string(conf, section, UTF8_IN); - if (f == NULL) - ERR_clear_error(); - else if (strcmp(f, "yes") == 0) - chtype = MBSTRING_UTF8; - } - - db_attr.unique_subject = 1; - p = NCONF_get_string(conf, section, ENV_UNIQUE_SUBJECT); - if (p != NULL) - db_attr.unique_subject = parse_yesno(p, 1); - else - ERR_clear_error(); - - /*****************************************************************/ - /* report status of cert with serial number given on command line */ - if (ser_status) { - dbfile = lookup_conf(conf, section, ENV_DATABASE); - if (dbfile == NULL) - goto end; - - db = load_index(dbfile, &db_attr); - if (db == NULL) - goto end; - - if (index_index(db) <= 0) - goto end; - - if (get_certificate_status(ser_status, db) != 1) - BIO_printf(bio_err, "Error verifying serial %s!\n", ser_status); - goto end; - } - - /*****************************************************************/ - /* we definitely need a private key, so let's get it */ - - if (keyfile == NULL - && (keyfile = lookup_conf(conf, section, ENV_PRIVATE_KEY)) == NULL) - goto end; - - if (key == NULL) { - free_key = 1; - if (!app_passwd(passinarg, NULL, &key, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - } - pkey = load_key(keyfile, keyformat, 0, key, e, "CA private key"); - if (key != NULL) - OPENSSL_cleanse(key, strlen(key)); - if (pkey == NULL) - /* load_key() has already printed an appropriate message */ - goto end; - - /*****************************************************************/ - /* we need a certificate */ - if (!selfsign || spkac_file || ss_cert_file || gencrl) { - if (certfile == NULL - && (certfile = lookup_conf(conf, section, ENV_CERTIFICATE)) == NULL) - goto end; - - x509 = load_cert(certfile, FORMAT_PEM, "CA certificate"); - if (x509 == NULL) - goto end; - - if (!X509_check_private_key(x509, pkey)) { - BIO_printf(bio_err, - "CA certificate and CA private key do not match\n"); - goto end; - } - } - if (!selfsign) - x509p = x509; - - f = NCONF_get_string(conf, BASE_SECTION, ENV_PRESERVE); - if (f == NULL) - ERR_clear_error(); - if ((f != NULL) && ((*f == 'y') || (*f == 'Y'))) - preserve = 1; - f = NCONF_get_string(conf, BASE_SECTION, ENV_MSIE_HACK); - if (f == NULL) - ERR_clear_error(); - if ((f != NULL) && ((*f == 'y') || (*f == 'Y'))) - msie_hack = 1; - - f = NCONF_get_string(conf, section, ENV_NAMEOPT); - - if (f != NULL) { - if (!set_nameopt(f)) { - BIO_printf(bio_err, "Invalid name options: \"%s\"\n", f); - goto end; - } - default_op = 0; - } - - f = NCONF_get_string(conf, section, ENV_CERTOPT); - - if (f != NULL) { - if (!set_cert_ex(&certopt, f)) { - BIO_printf(bio_err, "Invalid certificate options: \"%s\"\n", f); - goto end; - } - default_op = 0; - } else { - ERR_clear_error(); - } - - f = NCONF_get_string(conf, section, ENV_EXTCOPY); - - if (f != NULL) { - if (!set_ext_copy(&ext_copy, f)) { - BIO_printf(bio_err, "Invalid extension copy option: \"%s\"\n", f); - goto end; - } - } else { - ERR_clear_error(); - } - - /*****************************************************************/ - /* lookup where to write new certificates */ - if ((outdir == NULL) && (req)) { - - outdir = NCONF_get_string(conf, section, ENV_NEW_CERTS_DIR); - if (outdir == NULL) { - BIO_printf(bio_err, - "there needs to be defined a directory for new certificate to be placed in\n"); - goto end; - } -#ifndef OPENSSL_SYS_VMS - /* - * outdir is a directory spec, but access() for VMS demands a - * filename. We could use the DEC C routine to convert the - * directory syntax to Unix, and give that to app_isdir, - * but for now the fopen will catch the error if it's not a - * directory - */ - if (app_isdir(outdir) <= 0) { - BIO_printf(bio_err, "%s: %s is not a directory\n", prog, outdir); - perror(outdir); - goto end; - } -#endif - } - - /*****************************************************************/ - /* we need to load the database file */ - dbfile = lookup_conf(conf, section, ENV_DATABASE); - if (dbfile == NULL) - goto end; - - db = load_index(dbfile, &db_attr); - if (db == NULL) - goto end; - - /* Lets check some fields */ - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - pp = sk_OPENSSL_PSTRING_value(db->db->data, i); - if ((pp[DB_type][0] != DB_TYPE_REV) && (pp[DB_rev_date][0] != '\0')) { - BIO_printf(bio_err, - "entry %d: not revoked yet, but has a revocation date\n", - i + 1); - goto end; - } - if ((pp[DB_type][0] == DB_TYPE_REV) && - !make_revoked(NULL, pp[DB_rev_date])) { - BIO_printf(bio_err, " in entry %d\n", i + 1); - goto end; - } - if (!check_time_format((char *)pp[DB_exp_date])) { - BIO_printf(bio_err, "entry %d: invalid expiry date\n", i + 1); - goto end; - } - p = pp[DB_serial]; - j = strlen(p); - if (*p == '-') { - p++; - j--; - } - if ((j & 1) || (j < 2)) { - BIO_printf(bio_err, "entry %d: bad serial number length (%d)\n", - i + 1, j); - goto end; - } - for ( ; *p; p++) { - if (!isxdigit(_UC(*p))) { - BIO_printf(bio_err, - "entry %d: bad char 0%o '%c' in serial number\n", - i + 1, *p, *p); - goto end; - } - } - } - if (verbose) { - TXT_DB_write(bio_out, db->db); - BIO_printf(bio_err, "%d entries loaded from the database\n", - sk_OPENSSL_PSTRING_num(db->db->data)); - BIO_printf(bio_err, "generating index\n"); - } - - if (index_index(db) <= 0) - goto end; - - /*****************************************************************/ - /* Update the db file for expired certificates */ - if (doupdatedb) { - if (verbose) - BIO_printf(bio_err, "Updating %s ...\n", dbfile); - - i = do_updatedb(db); - if (i == -1) { - BIO_printf(bio_err, "Malloc failure\n"); - goto end; - } else if (i == 0) { - if (verbose) - BIO_printf(bio_err, "No entries found to mark expired\n"); - } else { - if (!save_index(dbfile, "new", db)) - goto end; - - if (!rotate_index(dbfile, "new", "old")) - goto end; - - if (verbose) - BIO_printf(bio_err, "Done. %d entries marked as expired\n", i); - } - } - - /*****************************************************************/ - /* Read extensions config file */ - if (extfile) { - if ((extconf = app_load_config(extfile)) == NULL) { - ret = 1; - goto end; - } - - if (verbose) - BIO_printf(bio_err, "Successfully loaded extensions file %s\n", - extfile); - - /* We can have sections in the ext file */ - if (extensions == NULL) { - extensions = NCONF_get_string(extconf, "default", "extensions"); - if (extensions == NULL) - extensions = "default"; - } - } - - /*****************************************************************/ - if (req || gencrl) { - if (spkac_file != NULL && outfile != NULL) { - output_der = 1; - batch = 1; - } - } - - def_ret = EVP_PKEY_get_default_digest_nid(pkey, &def_nid); - /* - * EVP_PKEY_get_default_digest_nid() returns 2 if the digest is - * mandatory for this algorithm. - */ - if (def_ret == 2 && def_nid == NID_undef) { - /* The signing algorithm requires there to be no digest */ - dgst = EVP_md_null(); - } else if (md == NULL - && (md = lookup_conf(conf, section, ENV_DEFAULT_MD)) == NULL) { - goto end; - } else { - if (strcmp(md, "default") == 0) { - if (def_ret <= 0) { - BIO_puts(bio_err, "no default digest\n"); - goto end; - } - md = (char *)OBJ_nid2sn(def_nid); - } - - if (!opt_md(md, &dgst)) - goto end; - } - - if (req) { - if (email_dn == 1) { - char *tmp_email_dn = NULL; - - tmp_email_dn = NCONF_get_string(conf, section, ENV_DEFAULT_EMAIL_DN); - if (tmp_email_dn != NULL && strcmp(tmp_email_dn, "no") == 0) - email_dn = 0; - } - if (verbose) - BIO_printf(bio_err, "message digest is %s\n", - OBJ_nid2ln(EVP_MD_type(dgst))); - if (policy == NULL - && (policy = lookup_conf(conf, section, ENV_POLICY)) == NULL) - goto end; - - if (verbose) - BIO_printf(bio_err, "policy is %s\n", policy); - - if (NCONF_get_string(conf, section, ENV_RAND_SERIAL) != NULL) { - rand_ser = 1; - } else { - serialfile = lookup_conf(conf, section, ENV_SERIAL); - if (serialfile == NULL) - goto end; - } - - if (extconf == NULL) { - /* - * no '-extfile' option, so we look for extensions in the main - * configuration file - */ - if (extensions == NULL) { - extensions = NCONF_get_string(conf, section, ENV_EXTENSIONS); - if (extensions == NULL) - ERR_clear_error(); - } - if (extensions != NULL) { - /* Check syntax of file */ - X509V3_CTX ctx; - X509V3_set_ctx_test(&ctx); - X509V3_set_nconf(&ctx, conf); - if (!X509V3_EXT_add_nconf(conf, &ctx, extensions, NULL)) { - BIO_printf(bio_err, - "Error Loading extension section %s\n", - extensions); - ret = 1; - goto end; - } - } - } - - if (startdate == NULL) { - startdate = NCONF_get_string(conf, section, ENV_DEFAULT_STARTDATE); - if (startdate == NULL) - ERR_clear_error(); - } - if (startdate != NULL && !ASN1_TIME_set_string_X509(NULL, startdate)) { - BIO_printf(bio_err, - "start date is invalid, it should be YYMMDDHHMMSSZ or YYYYMMDDHHMMSSZ\n"); - goto end; - } - if (startdate == NULL) - startdate = "today"; - - if (enddate == NULL) { - enddate = NCONF_get_string(conf, section, ENV_DEFAULT_ENDDATE); - if (enddate == NULL) - ERR_clear_error(); - } - if (enddate != NULL && !ASN1_TIME_set_string_X509(NULL, enddate)) { - BIO_printf(bio_err, - "end date is invalid, it should be YYMMDDHHMMSSZ or YYYYMMDDHHMMSSZ\n"); - goto end; - } - - if (days == 0) { - if (!NCONF_get_number(conf, section, ENV_DEFAULT_DAYS, &days)) - days = 0; - } - if (enddate == NULL && days == 0) { - BIO_printf(bio_err, "cannot lookup how many days to certify for\n"); - goto end; - } - - if (rand_ser) { - if ((serial = BN_new()) == NULL || !rand_serial(serial, NULL)) { - BIO_printf(bio_err, "error generating serial number\n"); - goto end; - } - } else { - if ((serial = load_serial(serialfile, create_ser, NULL)) == NULL) { - BIO_printf(bio_err, "error while loading serial number\n"); - goto end; - } - if (verbose) { - if (BN_is_zero(serial)) { - BIO_printf(bio_err, "next serial number is 00\n"); - } else { - if ((f = BN_bn2hex(serial)) == NULL) - goto end; - BIO_printf(bio_err, "next serial number is %s\n", f); - OPENSSL_free(f); - } - } - } - - if ((attribs = NCONF_get_section(conf, policy)) == NULL) { - BIO_printf(bio_err, "unable to find 'section' for %s\n", policy); - goto end; - } - - if ((cert_sk = sk_X509_new_null()) == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - if (spkac_file != NULL) { - total++; - j = certify_spkac(&x, spkac_file, pkey, x509, dgst, sigopts, - attribs, db, serial, subj, chtype, multirdn, - email_dn, startdate, enddate, days, extensions, - conf, verbose, certopt, get_nameopt(), default_op, - ext_copy); - if (j < 0) - goto end; - if (j > 0) { - total_done++; - BIO_printf(bio_err, "\n"); - if (!BN_add_word(serial, 1)) - goto end; - if (!sk_X509_push(cert_sk, x)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - } - } - if (ss_cert_file != NULL) { - total++; - j = certify_cert(&x, ss_cert_file, pkey, x509, dgst, sigopts, - attribs, - db, serial, subj, chtype, multirdn, email_dn, - startdate, enddate, days, batch, extensions, - conf, verbose, certopt, get_nameopt(), default_op, - ext_copy); - if (j < 0) - goto end; - if (j > 0) { - total_done++; - BIO_printf(bio_err, "\n"); - if (!BN_add_word(serial, 1)) - goto end; - if (!sk_X509_push(cert_sk, x)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - } - } - if (infile != NULL) { - total++; - j = certify(&x, infile, pkey, x509p, dgst, sigopts, attribs, db, - serial, subj, chtype, multirdn, email_dn, startdate, - enddate, days, batch, extensions, conf, verbose, - certopt, get_nameopt(), default_op, ext_copy, selfsign); - if (j < 0) - goto end; - if (j > 0) { - total_done++; - BIO_printf(bio_err, "\n"); - if (!BN_add_word(serial, 1)) - goto end; - if (!sk_X509_push(cert_sk, x)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - } - } - for (i = 0; i < argc; i++) { - total++; - j = certify(&x, argv[i], pkey, x509p, dgst, sigopts, attribs, db, - serial, subj, chtype, multirdn, email_dn, startdate, - enddate, days, batch, extensions, conf, verbose, - certopt, get_nameopt(), default_op, ext_copy, selfsign); - if (j < 0) - goto end; - if (j > 0) { - total_done++; - BIO_printf(bio_err, "\n"); - if (!BN_add_word(serial, 1)) { - X509_free(x); - goto end; - } - if (!sk_X509_push(cert_sk, x)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - X509_free(x); - goto end; - } - } - } - /* - * we have a stack of newly certified certificates and a data base - * and serial number that need updating - */ - - if (sk_X509_num(cert_sk) > 0) { - if (!batch) { - BIO_printf(bio_err, - "\n%d out of %d certificate requests certified, commit? [y/n]", - total_done, total); - (void)BIO_flush(bio_err); - tmp[0] = '\0'; - if (fgets(tmp, sizeof(tmp), stdin) == NULL) { - BIO_printf(bio_err, "CERTIFICATION CANCELED: I/O error\n"); - ret = 0; - goto end; - } - if (tmp[0] != 'y' && tmp[0] != 'Y') { - BIO_printf(bio_err, "CERTIFICATION CANCELED\n"); - ret = 0; - goto end; - } - } - - BIO_printf(bio_err, "Write out database with %d new entries\n", - sk_X509_num(cert_sk)); - - if (serialfile != NULL - && !save_serial(serialfile, "new", serial, NULL)) - goto end; - - if (!save_index(dbfile, "new", db)) - goto end; - } - - outdirlen = OPENSSL_strlcpy(new_cert, outdir, sizeof(new_cert)); -#ifndef OPENSSL_SYS_VMS - outdirlen = OPENSSL_strlcat(new_cert, "/", sizeof(new_cert)); -#endif - - if (verbose) - BIO_printf(bio_err, "writing new certificates\n"); - - for (i = 0; i < sk_X509_num(cert_sk); i++) { - BIO *Cout = NULL; - X509 *xi = sk_X509_value(cert_sk, i); - ASN1_INTEGER *serialNumber = X509_get_serialNumber(xi); - const unsigned char *psn = ASN1_STRING_get0_data(serialNumber); - const int snl = ASN1_STRING_length(serialNumber); - const int filen_len = 2 * (snl > 0 ? snl : 1) + sizeof(".pem"); - char *n = new_cert + outdirlen; - - if (outdirlen + filen_len > PATH_MAX) { - BIO_printf(bio_err, "certificate file name too long\n"); - goto end; - } - - if (snl > 0) { - static const char HEX_DIGITS[] = "0123456789ABCDEF"; - - for (j = 0; j < snl; j++, psn++) { - *n++ = HEX_DIGITS[*psn >> 4]; - *n++ = HEX_DIGITS[*psn & 0x0F]; - } - } else { - *(n++) = '0'; - *(n++) = '0'; - } - *(n++) = '.'; - *(n++) = 'p'; - *(n++) = 'e'; - *(n++) = 'm'; - *n = '\0'; /* closing new_cert */ - if (verbose) - BIO_printf(bio_err, "writing %s\n", new_cert); - - Sout = bio_open_default(outfile, 'w', - output_der ? FORMAT_ASN1 : FORMAT_TEXT); - if (Sout == NULL) - goto end; - - Cout = BIO_new_file(new_cert, "w"); - if (Cout == NULL) { - perror(new_cert); - goto end; - } - write_new_certificate(Cout, xi, 0, notext); - write_new_certificate(Sout, xi, output_der, notext); - BIO_free_all(Cout); - BIO_free_all(Sout); - Sout = NULL; - } - - if (sk_X509_num(cert_sk)) { - /* Rename the database and the serial file */ - if (serialfile != NULL - && !rotate_serial(serialfile, "new", "old")) - goto end; - - if (!rotate_index(dbfile, "new", "old")) - goto end; - - BIO_printf(bio_err, "Data Base Updated\n"); - } - } - - /*****************************************************************/ - if (gencrl) { - int crl_v2 = 0; - if (crl_ext == NULL) { - crl_ext = NCONF_get_string(conf, section, ENV_CRLEXT); - if (crl_ext == NULL) - ERR_clear_error(); - } - if (crl_ext != NULL) { - /* Check syntax of file */ - X509V3_CTX ctx; - X509V3_set_ctx_test(&ctx); - X509V3_set_nconf(&ctx, conf); - if (!X509V3_EXT_add_nconf(conf, &ctx, crl_ext, NULL)) { - BIO_printf(bio_err, - "Error Loading CRL extension section %s\n", crl_ext); - ret = 1; - goto end; - } - } - - if ((crlnumberfile = NCONF_get_string(conf, section, ENV_CRLNUMBER)) - != NULL) - if ((crlnumber = load_serial(crlnumberfile, 0, NULL)) == NULL) { - BIO_printf(bio_err, "error while loading CRL number\n"); - goto end; - } - - if (!crldays && !crlhours && !crlsec) { - if (!NCONF_get_number(conf, section, - ENV_DEFAULT_CRL_DAYS, &crldays)) - crldays = 0; - if (!NCONF_get_number(conf, section, - ENV_DEFAULT_CRL_HOURS, &crlhours)) - crlhours = 0; - ERR_clear_error(); - } - if ((crldays == 0) && (crlhours == 0) && (crlsec == 0)) { - BIO_printf(bio_err, - "cannot lookup how long until the next CRL is issued\n"); - goto end; - } - - if (verbose) - BIO_printf(bio_err, "making CRL\n"); - if ((crl = X509_CRL_new()) == NULL) - goto end; - if (!X509_CRL_set_issuer_name(crl, X509_get_subject_name(x509))) - goto end; - - tmptm = ASN1_TIME_new(); - if (tmptm == NULL - || X509_gmtime_adj(tmptm, 0) == NULL - || !X509_CRL_set1_lastUpdate(crl, tmptm) - || X509_time_adj_ex(tmptm, crldays, crlhours * 60 * 60 + crlsec, - NULL) == NULL) { - BIO_puts(bio_err, "error setting CRL nextUpdate\n"); - ASN1_TIME_free(tmptm); - goto end; - } - X509_CRL_set1_nextUpdate(crl, tmptm); - - ASN1_TIME_free(tmptm); - - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - pp = sk_OPENSSL_PSTRING_value(db->db->data, i); - if (pp[DB_type][0] == DB_TYPE_REV) { - if ((r = X509_REVOKED_new()) == NULL) - goto end; - j = make_revoked(r, pp[DB_rev_date]); - if (!j) - goto end; - if (j == 2) - crl_v2 = 1; - if (!BN_hex2bn(&serial, pp[DB_serial])) - goto end; - tmpser = BN_to_ASN1_INTEGER(serial, NULL); - BN_free(serial); - serial = NULL; - if (!tmpser) - goto end; - X509_REVOKED_set_serialNumber(r, tmpser); - ASN1_INTEGER_free(tmpser); - X509_CRL_add0_revoked(crl, r); - } - } - - /* - * sort the data so it will be written in serial number order - */ - X509_CRL_sort(crl); - - /* we now have a CRL */ - if (verbose) - BIO_printf(bio_err, "signing CRL\n"); - - /* Add any extensions asked for */ - - if (crl_ext != NULL || crlnumberfile != NULL) { - X509V3_CTX crlctx; - X509V3_set_ctx(&crlctx, x509, NULL, NULL, crl, 0); - X509V3_set_nconf(&crlctx, conf); - - if (crl_ext != NULL) - if (!X509V3_EXT_CRL_add_nconf(conf, &crlctx, crl_ext, crl)) - goto end; - if (crlnumberfile != NULL) { - tmpser = BN_to_ASN1_INTEGER(crlnumber, NULL); - if (!tmpser) - goto end; - X509_CRL_add1_ext_i2d(crl, NID_crl_number, tmpser, 0, 0); - ASN1_INTEGER_free(tmpser); - crl_v2 = 1; - if (!BN_add_word(crlnumber, 1)) - goto end; - } - } - if (crl_ext != NULL || crl_v2) { - if (!X509_CRL_set_version(crl, 1)) - goto end; /* version 2 CRL */ - } - - /* we have a CRL number that need updating */ - if (crlnumberfile != NULL - && !save_serial(crlnumberfile, "new", crlnumber, NULL)) - goto end; - - BN_free(crlnumber); - crlnumber = NULL; - - if (!do_X509_CRL_sign(crl, pkey, dgst, sigopts)) - goto end; - - Sout = bio_open_default(outfile, 'w', - output_der ? FORMAT_ASN1 : FORMAT_TEXT); - if (Sout == NULL) - goto end; - - PEM_write_bio_X509_CRL(Sout, crl); - - /* Rename the crlnumber file */ - if (crlnumberfile != NULL - && !rotate_serial(crlnumberfile, "new", "old")) - goto end; - - } - /*****************************************************************/ - if (dorevoke) { - if (infile == NULL) { - BIO_printf(bio_err, "no input files\n"); - goto end; - } else { - X509 *revcert; - revcert = load_cert(infile, FORMAT_PEM, infile); - if (revcert == NULL) - goto end; - if (dorevoke == 2) - rev_type = REV_VALID; - j = do_revoke(revcert, db, rev_type, rev_arg); - if (j <= 0) - goto end; - X509_free(revcert); - - if (!save_index(dbfile, "new", db)) - goto end; - - if (!rotate_index(dbfile, "new", "old")) - goto end; - - BIO_printf(bio_err, "Data Base Updated\n"); - } - } - ret = 0; - - end: - if (ret) - ERR_print_errors(bio_err); - BIO_free_all(Sout); - BIO_free_all(out); - BIO_free_all(in); - sk_X509_pop_free(cert_sk, X509_free); - - if (free_key) - OPENSSL_free(key); - BN_free(serial); - BN_free(crlnumber); - free_index(db); - sk_OPENSSL_STRING_free(sigopts); - EVP_PKEY_free(pkey); - X509_free(x509); - X509_CRL_free(crl); - NCONF_free(conf); - NCONF_free(extconf); - release_engine(e); - return ret; -} - -static char *lookup_conf(const CONF *conf, const char *section, const char *tag) -{ - char *entry = NCONF_get_string(conf, section, tag); - if (entry == NULL) - BIO_printf(bio_err, "variable lookup failed for %s::%s\n", section, tag); - return entry; -} - -static int certify(X509 **xret, const char *infile, EVP_PKEY *pkey, X509 *x509, - const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, - BIGNUM *serial, const char *subj, unsigned long chtype, - int multirdn, int email_dn, const char *startdate, - const char *enddate, - long days, int batch, const char *ext_sect, CONF *lconf, - int verbose, unsigned long certopt, unsigned long nameopt, - int default_op, int ext_copy, int selfsign) -{ - X509_REQ *req = NULL; - BIO *in = NULL; - EVP_PKEY *pktmp = NULL; - int ok = -1, i; - - in = BIO_new_file(infile, "r"); - if (in == NULL) { - ERR_print_errors(bio_err); - goto end; - } - if ((req = PEM_read_bio_X509_REQ(in, NULL, NULL, NULL)) == NULL) { - BIO_printf(bio_err, "Error reading certificate request in %s\n", - infile); - goto end; - } - if (verbose) - X509_REQ_print_ex(bio_err, req, nameopt, X509_FLAG_COMPAT); - - BIO_printf(bio_err, "Check that the request matches the signature\n"); - - if (selfsign && !X509_REQ_check_private_key(req, pkey)) { - BIO_printf(bio_err, - "Certificate request and CA private key do not match\n"); - ok = 0; - goto end; - } - if ((pktmp = X509_REQ_get0_pubkey(req)) == NULL) { - BIO_printf(bio_err, "error unpacking public key\n"); - goto end; - } - i = X509_REQ_verify(req, pktmp); - pktmp = NULL; - if (i < 0) { - ok = 0; - BIO_printf(bio_err, "Signature verification problems....\n"); - ERR_print_errors(bio_err); - goto end; - } - if (i == 0) { - ok = 0; - BIO_printf(bio_err, - "Signature did not match the certificate request\n"); - ERR_print_errors(bio_err); - goto end; - } else { - BIO_printf(bio_err, "Signature ok\n"); - } - - ok = do_body(xret, pkey, x509, dgst, sigopts, policy, db, serial, subj, - chtype, multirdn, email_dn, startdate, enddate, days, batch, - verbose, req, ext_sect, lconf, certopt, nameopt, default_op, - ext_copy, selfsign); - - end: - X509_REQ_free(req); - BIO_free(in); - return ok; -} - -static int certify_cert(X509 **xret, const char *infile, EVP_PKEY *pkey, X509 *x509, - const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, - BIGNUM *serial, const char *subj, unsigned long chtype, - int multirdn, int email_dn, const char *startdate, - const char *enddate, long days, int batch, const char *ext_sect, - CONF *lconf, int verbose, unsigned long certopt, - unsigned long nameopt, int default_op, int ext_copy) -{ - X509 *req = NULL; - X509_REQ *rreq = NULL; - EVP_PKEY *pktmp = NULL; - int ok = -1, i; - - if ((req = load_cert(infile, FORMAT_PEM, infile)) == NULL) - goto end; - if (verbose) - X509_print(bio_err, req); - - BIO_printf(bio_err, "Check that the request matches the signature\n"); - - if ((pktmp = X509_get0_pubkey(req)) == NULL) { - BIO_printf(bio_err, "error unpacking public key\n"); - goto end; - } - i = X509_verify(req, pktmp); - if (i < 0) { - ok = 0; - BIO_printf(bio_err, "Signature verification problems....\n"); - goto end; - } - if (i == 0) { - ok = 0; - BIO_printf(bio_err, "Signature did not match the certificate\n"); - goto end; - } else { - BIO_printf(bio_err, "Signature ok\n"); - } - - if ((rreq = X509_to_X509_REQ(req, NULL, NULL)) == NULL) - goto end; - - ok = do_body(xret, pkey, x509, dgst, sigopts, policy, db, serial, subj, - chtype, multirdn, email_dn, startdate, enddate, days, batch, - verbose, rreq, ext_sect, lconf, certopt, nameopt, default_op, - ext_copy, 0); - - end: - X509_REQ_free(rreq); - X509_free(req); - return ok; -} - -static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, - const EVP_MD *dgst, STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, BIGNUM *serial, - const char *subj, unsigned long chtype, int multirdn, - int email_dn, const char *startdate, const char *enddate, long days, - int batch, int verbose, X509_REQ *req, const char *ext_sect, - CONF *lconf, unsigned long certopt, unsigned long nameopt, - int default_op, int ext_copy, int selfsign) -{ - X509_NAME *name = NULL, *CAname = NULL, *subject = NULL; - const ASN1_TIME *tm; - ASN1_STRING *str, *str2; - ASN1_OBJECT *obj; - X509 *ret = NULL; - X509_NAME_ENTRY *ne, *tne; - EVP_PKEY *pktmp; - int ok = -1, i, j, last, nid; - const char *p; - CONF_VALUE *cv; - OPENSSL_STRING row[DB_NUMBER]; - OPENSSL_STRING *irow = NULL; - OPENSSL_STRING *rrow = NULL; - char buf[25]; - - for (i = 0; i < DB_NUMBER; i++) - row[i] = NULL; - - if (subj) { - X509_NAME *n = parse_name(subj, chtype, multirdn); - - if (!n) { - ERR_print_errors(bio_err); - goto end; - } - X509_REQ_set_subject_name(req, n); - X509_NAME_free(n); - } - - if (default_op) - BIO_printf(bio_err, "The Subject's Distinguished Name is as follows\n"); - - name = X509_REQ_get_subject_name(req); - for (i = 0; i < X509_NAME_entry_count(name); i++) { - ne = X509_NAME_get_entry(name, i); - str = X509_NAME_ENTRY_get_data(ne); - obj = X509_NAME_ENTRY_get_object(ne); - nid = OBJ_obj2nid(obj); - - if (msie_hack) { - /* assume all type should be strings */ - - if (str->type == V_ASN1_UNIVERSALSTRING) - ASN1_UNIVERSALSTRING_to_string(str); - - if (str->type == V_ASN1_IA5STRING && nid != NID_pkcs9_emailAddress) - str->type = V_ASN1_T61STRING; - - if (nid == NID_pkcs9_emailAddress - && str->type == V_ASN1_PRINTABLESTRING) - str->type = V_ASN1_IA5STRING; - } - - /* If no EMAIL is wanted in the subject */ - if (nid == NID_pkcs9_emailAddress && !email_dn) - continue; - - /* check some things */ - if (nid == NID_pkcs9_emailAddress && str->type != V_ASN1_IA5STRING) { - BIO_printf(bio_err, - "\nemailAddress type needs to be of type IA5STRING\n"); - goto end; - } - if (str->type != V_ASN1_BMPSTRING && str->type != V_ASN1_UTF8STRING) { - j = ASN1_PRINTABLE_type(str->data, str->length); - if ((j == V_ASN1_T61STRING && str->type != V_ASN1_T61STRING) || - (j == V_ASN1_IA5STRING && str->type == V_ASN1_PRINTABLESTRING)) - { - BIO_printf(bio_err, - "\nThe string contains characters that are illegal for the ASN.1 type\n"); - goto end; - } - } - - if (default_op) - old_entry_print(obj, str); - } - - /* Ok, now we check the 'policy' stuff. */ - if ((subject = X509_NAME_new()) == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - - /* take a copy of the issuer name before we mess with it. */ - if (selfsign) - CAname = X509_NAME_dup(name); - else - CAname = X509_NAME_dup(X509_get_subject_name(x509)); - if (CAname == NULL) - goto end; - str = str2 = NULL; - - for (i = 0; i < sk_CONF_VALUE_num(policy); i++) { - cv = sk_CONF_VALUE_value(policy, i); /* get the object id */ - if ((j = OBJ_txt2nid(cv->name)) == NID_undef) { - BIO_printf(bio_err, - "%s:unknown object type in 'policy' configuration\n", - cv->name); - goto end; - } - obj = OBJ_nid2obj(j); - - last = -1; - for (;;) { - X509_NAME_ENTRY *push = NULL; - - /* lookup the object in the supplied name list */ - j = X509_NAME_get_index_by_OBJ(name, obj, last); - if (j < 0) { - if (last != -1) - break; - tne = NULL; - } else { - tne = X509_NAME_get_entry(name, j); - } - last = j; - - /* depending on the 'policy', decide what to do. */ - if (strcmp(cv->value, "optional") == 0) { - if (tne != NULL) - push = tne; - } else if (strcmp(cv->value, "supplied") == 0) { - if (tne == NULL) { - BIO_printf(bio_err, - "The %s field needed to be supplied and was missing\n", - cv->name); - goto end; - } else { - push = tne; - } - } else if (strcmp(cv->value, "match") == 0) { - int last2; - - if (tne == NULL) { - BIO_printf(bio_err, - "The mandatory %s field was missing\n", - cv->name); - goto end; - } - - last2 = -1; - - again2: - j = X509_NAME_get_index_by_OBJ(CAname, obj, last2); - if ((j < 0) && (last2 == -1)) { - BIO_printf(bio_err, - "The %s field does not exist in the CA certificate,\n" - "the 'policy' is misconfigured\n", cv->name); - goto end; - } - if (j >= 0) { - push = X509_NAME_get_entry(CAname, j); - str = X509_NAME_ENTRY_get_data(tne); - str2 = X509_NAME_ENTRY_get_data(push); - last2 = j; - if (ASN1_STRING_cmp(str, str2) != 0) - goto again2; - } - if (j < 0) { - BIO_printf(bio_err, - "The %s field is different between\n" - "CA certificate (%s) and the request (%s)\n", - cv->name, - ((str2 == NULL) ? "NULL" : (char *)str2->data), - ((str == NULL) ? "NULL" : (char *)str->data)); - goto end; - } - } else { - BIO_printf(bio_err, - "%s:invalid type in 'policy' configuration\n", - cv->value); - goto end; - } - - if (push != NULL) { - if (!X509_NAME_add_entry(subject, push, -1, 0)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - } - if (j < 0) - break; - } - } - - if (preserve) { - X509_NAME_free(subject); - /* subject=X509_NAME_dup(X509_REQ_get_subject_name(req)); */ - subject = X509_NAME_dup(name); - if (subject == NULL) - goto end; - } - - /* We are now totally happy, lets make and sign the certificate */ - if (verbose) - BIO_printf(bio_err, - "Everything appears to be ok, creating and signing the certificate\n"); - - if ((ret = X509_new()) == NULL) - goto end; - -#ifdef X509_V3 - /* Make it an X509 v3 certificate. */ - if (!X509_set_version(ret, 2)) - goto end; -#endif - - if (BN_to_ASN1_INTEGER(serial, X509_get_serialNumber(ret)) == NULL) - goto end; - if (selfsign) { - if (!X509_set_issuer_name(ret, subject)) - goto end; - } else { - if (!X509_set_issuer_name(ret, X509_get_subject_name(x509))) - goto end; - } - - if (!set_cert_times(ret, startdate, enddate, days)) - goto end; - - if (enddate != NULL) { - int tdays; - - if (!ASN1_TIME_diff(&tdays, NULL, NULL, X509_get0_notAfter(ret))) - goto end; - days = tdays; - } - - if (!X509_set_subject_name(ret, subject)) - goto end; - - pktmp = X509_REQ_get0_pubkey(req); - i = X509_set_pubkey(ret, pktmp); - if (!i) - goto end; - - /* Lets add the extensions, if there are any */ - if (ext_sect) { - X509V3_CTX ctx; - - /* Initialize the context structure */ - if (selfsign) - X509V3_set_ctx(&ctx, ret, ret, req, NULL, 0); - else - X509V3_set_ctx(&ctx, x509, ret, req, NULL, 0); - - if (extconf != NULL) { - if (verbose) - BIO_printf(bio_err, "Extra configuration file found\n"); - - /* Use the extconf configuration db LHASH */ - X509V3_set_nconf(&ctx, extconf); - - /* Test the structure (needed?) */ - /* X509V3_set_ctx_test(&ctx); */ - - /* Adds exts contained in the configuration file */ - if (!X509V3_EXT_add_nconf(extconf, &ctx, ext_sect, ret)) { - BIO_printf(bio_err, - "ERROR: adding extensions in section %s\n", - ext_sect); - ERR_print_errors(bio_err); - goto end; - } - if (verbose) - BIO_printf(bio_err, - "Successfully added extensions from file.\n"); - } else if (ext_sect) { - /* We found extensions to be set from config file */ - X509V3_set_nconf(&ctx, lconf); - - if (!X509V3_EXT_add_nconf(lconf, &ctx, ext_sect, ret)) { - BIO_printf(bio_err, - "ERROR: adding extensions in section %s\n", - ext_sect); - ERR_print_errors(bio_err); - goto end; - } - - if (verbose) - BIO_printf(bio_err, - "Successfully added extensions from config\n"); - } - } - - /* Copy extensions from request (if any) */ - - if (!copy_extensions(ret, req, ext_copy)) { - BIO_printf(bio_err, "ERROR: adding extensions from request\n"); - ERR_print_errors(bio_err); - goto end; - } - - { - const STACK_OF(X509_EXTENSION) *exts = X509_get0_extensions(ret); - - if (exts != NULL && sk_X509_EXTENSION_num(exts) > 0) - /* Make it an X509 v3 certificate. */ - if (!X509_set_version(ret, 2)) - goto end; - } - - if (verbose) - BIO_printf(bio_err, - "The subject name appears to be ok, checking data base for clashes\n"); - - /* Build the correct Subject if no e-mail is wanted in the subject. */ - if (!email_dn) { - X509_NAME_ENTRY *tmpne; - X509_NAME *dn_subject; - - /* - * Its best to dup the subject DN and then delete any email addresses - * because this retains its structure. - */ - if ((dn_subject = X509_NAME_dup(subject)) == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - i = -1; - while ((i = X509_NAME_get_index_by_NID(dn_subject, - NID_pkcs9_emailAddress, - i)) >= 0) { - tmpne = X509_NAME_delete_entry(dn_subject, i--); - X509_NAME_ENTRY_free(tmpne); - } - - if (!X509_set_subject_name(ret, dn_subject)) { - X509_NAME_free(dn_subject); - goto end; - } - X509_NAME_free(dn_subject); - } - - row[DB_name] = X509_NAME_oneline(X509_get_subject_name(ret), NULL, 0); - if (row[DB_name] == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - - if (BN_is_zero(serial)) - row[DB_serial] = OPENSSL_strdup("00"); - else - row[DB_serial] = BN_bn2hex(serial); - if (row[DB_serial] == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - - if (row[DB_name][0] == '\0') { - /* - * An empty subject! We'll use the serial number instead. If - * unique_subject is in use then we don't want different entries with - * empty subjects matching each other. - */ - OPENSSL_free(row[DB_name]); - row[DB_name] = OPENSSL_strdup(row[DB_serial]); - if (row[DB_name] == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - } - - if (db->attributes.unique_subject) { - OPENSSL_STRING *crow = row; - - rrow = TXT_DB_get_by_index(db->db, DB_name, crow); - if (rrow != NULL) { - BIO_printf(bio_err, - "ERROR:There is already a certificate for %s\n", - row[DB_name]); - } - } - if (rrow == NULL) { - rrow = TXT_DB_get_by_index(db->db, DB_serial, row); - if (rrow != NULL) { - BIO_printf(bio_err, - "ERROR:Serial number %s has already been issued,\n", - row[DB_serial]); - BIO_printf(bio_err, - " check the database/serial_file for corruption\n"); - } - } - - if (rrow != NULL) { - BIO_printf(bio_err, "The matching entry has the following details\n"); - if (rrow[DB_type][0] == DB_TYPE_EXP) - p = "Expired"; - else if (rrow[DB_type][0] == DB_TYPE_REV) - p = "Revoked"; - else if (rrow[DB_type][0] == DB_TYPE_VAL) - p = "Valid"; - else - p = "\ninvalid type, Data base error\n"; - BIO_printf(bio_err, "Type :%s\n", p);; - if (rrow[DB_type][0] == DB_TYPE_REV) { - p = rrow[DB_exp_date]; - if (p == NULL) - p = "undef"; - BIO_printf(bio_err, "Was revoked on:%s\n", p); - } - p = rrow[DB_exp_date]; - if (p == NULL) - p = "undef"; - BIO_printf(bio_err, "Expires on :%s\n", p); - p = rrow[DB_serial]; - if (p == NULL) - p = "undef"; - BIO_printf(bio_err, "Serial Number :%s\n", p); - p = rrow[DB_file]; - if (p == NULL) - p = "undef"; - BIO_printf(bio_err, "File name :%s\n", p); - p = rrow[DB_name]; - if (p == NULL) - p = "undef"; - BIO_printf(bio_err, "Subject Name :%s\n", p); - ok = -1; /* This is now a 'bad' error. */ - goto end; - } - - if (!default_op) { - BIO_printf(bio_err, "Certificate Details:\n"); - /* - * Never print signature details because signature not present - */ - certopt |= X509_FLAG_NO_SIGDUMP | X509_FLAG_NO_SIGNAME; - X509_print_ex(bio_err, ret, nameopt, certopt); - } - - BIO_printf(bio_err, "Certificate is to be certified until "); - ASN1_TIME_print(bio_err, X509_get0_notAfter(ret)); - if (days) - BIO_printf(bio_err, " (%ld days)", days); - BIO_printf(bio_err, "\n"); - - if (!batch) { - - BIO_printf(bio_err, "Sign the certificate? [y/n]:"); - (void)BIO_flush(bio_err); - buf[0] = '\0'; - if (fgets(buf, sizeof(buf), stdin) == NULL) { - BIO_printf(bio_err, - "CERTIFICATE WILL NOT BE CERTIFIED: I/O error\n"); - ok = 0; - goto end; - } - if (!(buf[0] == 'y' || buf[0] == 'Y')) { - BIO_printf(bio_err, "CERTIFICATE WILL NOT BE CERTIFIED\n"); - ok = 0; - goto end; - } - } - - pktmp = X509_get0_pubkey(ret); - if (EVP_PKEY_missing_parameters(pktmp) && - !EVP_PKEY_missing_parameters(pkey)) - EVP_PKEY_copy_parameters(pktmp, pkey); - - if (!do_X509_sign(ret, pkey, dgst, sigopts)) - goto end; - - /* We now just add it to the database as DB_TYPE_VAL('V') */ - row[DB_type] = OPENSSL_strdup("V"); - tm = X509_get0_notAfter(ret); - row[DB_exp_date] = app_malloc(tm->length + 1, "row expdate"); - memcpy(row[DB_exp_date], tm->data, tm->length); - row[DB_exp_date][tm->length] = '\0'; - row[DB_rev_date] = NULL; - row[DB_file] = OPENSSL_strdup("unknown"); - if ((row[DB_type] == NULL) || (row[DB_file] == NULL) - || (row[DB_name] == NULL)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - - irow = app_malloc(sizeof(*irow) * (DB_NUMBER + 1), "row space"); - for (i = 0; i < DB_NUMBER; i++) - irow[i] = row[i]; - irow[DB_NUMBER] = NULL; - - if (!TXT_DB_insert(db->db, irow)) { - BIO_printf(bio_err, "failed to update database\n"); - BIO_printf(bio_err, "TXT_DB error number %ld\n", db->db->error); - goto end; - } - irow = NULL; - ok = 1; - end: - if (ok != 1) { - for (i = 0; i < DB_NUMBER; i++) - OPENSSL_free(row[i]); - } - OPENSSL_free(irow); - - X509_NAME_free(CAname); - X509_NAME_free(subject); - if (ok <= 0) - X509_free(ret); - else - *xret = ret; - return ok; -} - -static void write_new_certificate(BIO *bp, X509 *x, int output_der, int notext) -{ - - if (output_der) { - (void)i2d_X509_bio(bp, x); - return; - } - if (!notext) - X509_print(bp, x); - PEM_write_bio_X509(bp, x); -} - -static int certify_spkac(X509 **xret, const char *infile, EVP_PKEY *pkey, - X509 *x509, const EVP_MD *dgst, - STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(CONF_VALUE) *policy, CA_DB *db, - BIGNUM *serial, const char *subj, unsigned long chtype, - int multirdn, int email_dn, const char *startdate, - const char *enddate, long days, const char *ext_sect, - CONF *lconf, int verbose, unsigned long certopt, - unsigned long nameopt, int default_op, int ext_copy) -{ - STACK_OF(CONF_VALUE) *sk = NULL; - LHASH_OF(CONF_VALUE) *parms = NULL; - X509_REQ *req = NULL; - CONF_VALUE *cv = NULL; - NETSCAPE_SPKI *spki = NULL; - char *type, *buf; - EVP_PKEY *pktmp = NULL; - X509_NAME *n = NULL; - X509_NAME_ENTRY *ne = NULL; - int ok = -1, i, j; - long errline; - int nid; - - /* - * Load input file into a hash table. (This is just an easy - * way to read and parse the file, then put it into a convenient - * STACK format). - */ - parms = CONF_load(NULL, infile, &errline); - if (parms == NULL) { - BIO_printf(bio_err, "error on line %ld of %s\n", errline, infile); - ERR_print_errors(bio_err); - goto end; - } - - sk = CONF_get_section(parms, "default"); - if (sk_CONF_VALUE_num(sk) == 0) { - BIO_printf(bio_err, "no name/value pairs found in %s\n", infile); - goto end; - } - - /* - * Now create a dummy X509 request structure. We don't actually - * have an X509 request, but we have many of the components - * (a public key, various DN components). The idea is that we - * put these components into the right X509 request structure - * and we can use the same code as if you had a real X509 request. - */ - req = X509_REQ_new(); - if (req == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - /* - * Build up the subject name set. - */ - n = X509_REQ_get_subject_name(req); - - for (i = 0;; i++) { - if (sk_CONF_VALUE_num(sk) <= i) - break; - - cv = sk_CONF_VALUE_value(sk, i); - type = cv->name; - /* - * Skip past any leading X. X: X, etc to allow for multiple instances - */ - for (buf = cv->name; *buf; buf++) - if ((*buf == ':') || (*buf == ',') || (*buf == '.')) { - buf++; - if (*buf) - type = buf; - break; - } - - buf = cv->value; - if ((nid = OBJ_txt2nid(type)) == NID_undef) { - if (strcmp(type, "SPKAC") == 0) { - spki = NETSCAPE_SPKI_b64_decode(cv->value, -1); - if (spki == NULL) { - BIO_printf(bio_err, - "unable to load Netscape SPKAC structure\n"); - ERR_print_errors(bio_err); - goto end; - } - } - continue; - } - - if (!X509_NAME_add_entry_by_NID(n, nid, chtype, - (unsigned char *)buf, -1, -1, 0)) - goto end; - } - if (spki == NULL) { - BIO_printf(bio_err, "Netscape SPKAC structure not found in %s\n", - infile); - goto end; - } - - /* - * Now extract the key from the SPKI structure. - */ - - BIO_printf(bio_err, "Check that the SPKAC request matches the signature\n"); - - if ((pktmp = NETSCAPE_SPKI_get_pubkey(spki)) == NULL) { - BIO_printf(bio_err, "error unpacking SPKAC public key\n"); - goto end; - } - - j = NETSCAPE_SPKI_verify(spki, pktmp); - if (j <= 0) { - EVP_PKEY_free(pktmp); - BIO_printf(bio_err, - "signature verification failed on SPKAC public key\n"); - goto end; - } - BIO_printf(bio_err, "Signature ok\n"); - - X509_REQ_set_pubkey(req, pktmp); - EVP_PKEY_free(pktmp); - ok = do_body(xret, pkey, x509, dgst, sigopts, policy, db, serial, subj, - chtype, multirdn, email_dn, startdate, enddate, days, 1, - verbose, req, ext_sect, lconf, certopt, nameopt, default_op, - ext_copy, 0); - end: - X509_REQ_free(req); - CONF_free(parms); - NETSCAPE_SPKI_free(spki); - X509_NAME_ENTRY_free(ne); - - return ok; -} - -static int check_time_format(const char *str) -{ - return ASN1_TIME_set_string(NULL, str); -} - -static int do_revoke(X509 *x509, CA_DB *db, REVINFO_TYPE rev_type, - const char *value) -{ - const ASN1_TIME *tm = NULL; - char *row[DB_NUMBER], **rrow, **irow; - char *rev_str = NULL; - BIGNUM *bn = NULL; - int ok = -1, i; - - for (i = 0; i < DB_NUMBER; i++) - row[i] = NULL; - row[DB_name] = X509_NAME_oneline(X509_get_subject_name(x509), NULL, 0); - bn = ASN1_INTEGER_to_BN(X509_get_serialNumber(x509), NULL); - if (!bn) - goto end; - if (BN_is_zero(bn)) - row[DB_serial] = OPENSSL_strdup("00"); - else - row[DB_serial] = BN_bn2hex(bn); - BN_free(bn); - if (row[DB_name] != NULL && row[DB_name][0] == '\0') { - /* Entries with empty Subjects actually use the serial number instead */ - OPENSSL_free(row[DB_name]); - row[DB_name] = OPENSSL_strdup(row[DB_serial]); - } - if ((row[DB_name] == NULL) || (row[DB_serial] == NULL)) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - /* - * We have to lookup by serial number because name lookup skips revoked - * certs - */ - rrow = TXT_DB_get_by_index(db->db, DB_serial, row); - if (rrow == NULL) { - BIO_printf(bio_err, - "Adding Entry with serial number %s to DB for %s\n", - row[DB_serial], row[DB_name]); - - /* We now just add it to the database as DB_TYPE_REV('V') */ - row[DB_type] = OPENSSL_strdup("V"); - tm = X509_get0_notAfter(x509); - row[DB_exp_date] = app_malloc(tm->length + 1, "row exp_data"); - memcpy(row[DB_exp_date], tm->data, tm->length); - row[DB_exp_date][tm->length] = '\0'; - row[DB_rev_date] = NULL; - row[DB_file] = OPENSSL_strdup("unknown"); - - if (row[DB_type] == NULL || row[DB_file] == NULL) { - BIO_printf(bio_err, "Memory allocation failure\n"); - goto end; - } - - irow = app_malloc(sizeof(*irow) * (DB_NUMBER + 1), "row ptr"); - for (i = 0; i < DB_NUMBER; i++) - irow[i] = row[i]; - irow[DB_NUMBER] = NULL; - - if (!TXT_DB_insert(db->db, irow)) { - BIO_printf(bio_err, "failed to update database\n"); - BIO_printf(bio_err, "TXT_DB error number %ld\n", db->db->error); - OPENSSL_free(irow); - goto end; - } - - for (i = 0; i < DB_NUMBER; i++) - row[i] = NULL; - - /* Revoke Certificate */ - if (rev_type == REV_VALID) - ok = 1; - else - /* Retry revocation after DB insertion */ - ok = do_revoke(x509, db, rev_type, value); - - goto end; - - } else if (index_name_cmp_noconst(row, rrow)) { - BIO_printf(bio_err, "ERROR:name does not match %s\n", row[DB_name]); - goto end; - } else if (rev_type == REV_VALID) { - BIO_printf(bio_err, "ERROR:Already present, serial number %s\n", - row[DB_serial]); - goto end; - } else if (rrow[DB_type][0] == DB_TYPE_REV) { - BIO_printf(bio_err, "ERROR:Already revoked, serial number %s\n", - row[DB_serial]); - goto end; - } else { - BIO_printf(bio_err, "Revoking Certificate %s.\n", rrow[DB_serial]); - rev_str = make_revocation_str(rev_type, value); - if (!rev_str) { - BIO_printf(bio_err, "Error in revocation arguments\n"); - goto end; - } - rrow[DB_type][0] = DB_TYPE_REV; - rrow[DB_type][1] = '\0'; - rrow[DB_rev_date] = rev_str; - } - ok = 1; - end: - for (i = 0; i < DB_NUMBER; i++) - OPENSSL_free(row[i]); - return ok; -} - -static int get_certificate_status(const char *serial, CA_DB *db) -{ - char *row[DB_NUMBER], **rrow; - int ok = -1, i; - size_t serial_len = strlen(serial); - - /* Free Resources */ - for (i = 0; i < DB_NUMBER; i++) - row[i] = NULL; - - /* Malloc needed char spaces */ - row[DB_serial] = app_malloc(serial_len + 2, "row serial#"); - - if (serial_len % 2) { - /* - * Set the first char to 0 - */ - row[DB_serial][0] = '0'; - - /* Copy String from serial to row[DB_serial] */ - memcpy(row[DB_serial] + 1, serial, serial_len); - row[DB_serial][serial_len + 1] = '\0'; - } else { - /* Copy String from serial to row[DB_serial] */ - memcpy(row[DB_serial], serial, serial_len); - row[DB_serial][serial_len] = '\0'; - } - - /* Make it Upper Case */ - make_uppercase(row[DB_serial]); - - ok = 1; - - /* Search for the certificate */ - rrow = TXT_DB_get_by_index(db->db, DB_serial, row); - if (rrow == NULL) { - BIO_printf(bio_err, "Serial %s not present in db.\n", row[DB_serial]); - ok = -1; - goto end; - } else if (rrow[DB_type][0] == DB_TYPE_VAL) { - BIO_printf(bio_err, "%s=Valid (%c)\n", - row[DB_serial], rrow[DB_type][0]); - goto end; - } else if (rrow[DB_type][0] == DB_TYPE_REV) { - BIO_printf(bio_err, "%s=Revoked (%c)\n", - row[DB_serial], rrow[DB_type][0]); - goto end; - } else if (rrow[DB_type][0] == DB_TYPE_EXP) { - BIO_printf(bio_err, "%s=Expired (%c)\n", - row[DB_serial], rrow[DB_type][0]); - goto end; - } else if (rrow[DB_type][0] == DB_TYPE_SUSP) { - BIO_printf(bio_err, "%s=Suspended (%c)\n", - row[DB_serial], rrow[DB_type][0]); - goto end; - } else { - BIO_printf(bio_err, "%s=Unknown (%c).\n", - row[DB_serial], rrow[DB_type][0]); - ok = -1; - } - end: - for (i = 0; i < DB_NUMBER; i++) { - OPENSSL_free(row[i]); - } - return ok; -} - -static int do_updatedb(CA_DB *db) -{ - ASN1_TIME *a_tm = NULL; - int i, cnt = 0; - char **rrow; - - a_tm = ASN1_TIME_new(); - if (a_tm == NULL) - return -1; - - /* get actual time */ - if (X509_gmtime_adj(a_tm, 0) == NULL) { - ASN1_TIME_free(a_tm); - return -1; - } - - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - rrow = sk_OPENSSL_PSTRING_value(db->db->data, i); - - if (rrow[DB_type][0] == DB_TYPE_VAL) { - /* ignore entries that are not valid */ - ASN1_TIME *exp_date = NULL; - - exp_date = ASN1_TIME_new(); - if (exp_date == NULL) { - ASN1_TIME_free(a_tm); - return -1; - } - - if (!ASN1_TIME_set_string(exp_date, rrow[DB_exp_date])) { - ASN1_TIME_free(a_tm); - ASN1_TIME_free(exp_date); - return -1; - } - - if (ASN1_TIME_compare(exp_date, a_tm) <= 0) { - rrow[DB_type][0] = DB_TYPE_EXP; - rrow[DB_type][1] = '\0'; - cnt++; - - BIO_printf(bio_err, "%s=Expired\n", rrow[DB_serial]); - } - ASN1_TIME_free(exp_date); - } - } - - ASN1_TIME_free(a_tm); - return cnt; -} - -static const char *crl_reasons[] = { - /* CRL reason strings */ - "unspecified", - "keyCompromise", - "CACompromise", - "affiliationChanged", - "superseded", - "cessationOfOperation", - "certificateHold", - "removeFromCRL", - /* Additional pseudo reasons */ - "holdInstruction", - "keyTime", - "CAkeyTime" -}; - -#define NUM_REASONS OSSL_NELEM(crl_reasons) - -/* - * Given revocation information convert to a DB string. The format of the - * string is: revtime[,reason,extra]. Where 'revtime' is the revocation time - * (the current time). 'reason' is the optional CRL reason and 'extra' is any - * additional argument - */ - -static char *make_revocation_str(REVINFO_TYPE rev_type, const char *rev_arg) -{ - char *str; - const char *reason = NULL, *other = NULL; - ASN1_OBJECT *otmp; - ASN1_UTCTIME *revtm = NULL; - int i; - - switch (rev_type) { - case REV_NONE: - case REV_VALID: - break; - - case REV_CRL_REASON: - for (i = 0; i < 8; i++) { - if (strcasecmp(rev_arg, crl_reasons[i]) == 0) { - reason = crl_reasons[i]; - break; - } - } - if (reason == NULL) { - BIO_printf(bio_err, "Unknown CRL reason %s\n", rev_arg); - return NULL; - } - break; - - case REV_HOLD: - /* Argument is an OID */ - otmp = OBJ_txt2obj(rev_arg, 0); - ASN1_OBJECT_free(otmp); - - if (otmp == NULL) { - BIO_printf(bio_err, "Invalid object identifier %s\n", rev_arg); - return NULL; - } - - reason = "holdInstruction"; - other = rev_arg; - break; - - case REV_KEY_COMPROMISE: - case REV_CA_COMPROMISE: - /* Argument is the key compromise time */ - if (!ASN1_GENERALIZEDTIME_set_string(NULL, rev_arg)) { - BIO_printf(bio_err, - "Invalid time format %s. Need YYYYMMDDHHMMSSZ\n", - rev_arg); - return NULL; - } - other = rev_arg; - if (rev_type == REV_KEY_COMPROMISE) - reason = "keyTime"; - else - reason = "CAkeyTime"; - - break; - } - - revtm = X509_gmtime_adj(NULL, 0); - - if (!revtm) - return NULL; - - i = revtm->length + 1; - - if (reason) - i += strlen(reason) + 1; - if (other) - i += strlen(other) + 1; - - str = app_malloc(i, "revocation reason"); - OPENSSL_strlcpy(str, (char *)revtm->data, i); - if (reason) { - OPENSSL_strlcat(str, ",", i); - OPENSSL_strlcat(str, reason, i); - } - if (other) { - OPENSSL_strlcat(str, ",", i); - OPENSSL_strlcat(str, other, i); - } - ASN1_UTCTIME_free(revtm); - return str; -} - -/*- - * Convert revocation field to X509_REVOKED entry - * return code: - * 0 error - * 1 OK - * 2 OK and some extensions added (i.e. V2 CRL) - */ - -static int make_revoked(X509_REVOKED *rev, const char *str) -{ - char *tmp = NULL; - int reason_code = -1; - int i, ret = 0; - ASN1_OBJECT *hold = NULL; - ASN1_GENERALIZEDTIME *comp_time = NULL; - ASN1_ENUMERATED *rtmp = NULL; - - ASN1_TIME *revDate = NULL; - - i = unpack_revinfo(&revDate, &reason_code, &hold, &comp_time, str); - - if (i == 0) - goto end; - - if (rev && !X509_REVOKED_set_revocationDate(rev, revDate)) - goto end; - - if (rev && (reason_code != OCSP_REVOKED_STATUS_NOSTATUS)) { - rtmp = ASN1_ENUMERATED_new(); - if (rtmp == NULL || !ASN1_ENUMERATED_set(rtmp, reason_code)) - goto end; - if (!X509_REVOKED_add1_ext_i2d(rev, NID_crl_reason, rtmp, 0, 0)) - goto end; - } - - if (rev && comp_time) { - if (!X509_REVOKED_add1_ext_i2d - (rev, NID_invalidity_date, comp_time, 0, 0)) - goto end; - } - if (rev && hold) { - if (!X509_REVOKED_add1_ext_i2d - (rev, NID_hold_instruction_code, hold, 0, 0)) - goto end; - } - - if (reason_code != OCSP_REVOKED_STATUS_NOSTATUS) - ret = 2; - else - ret = 1; - - end: - - OPENSSL_free(tmp); - ASN1_OBJECT_free(hold); - ASN1_GENERALIZEDTIME_free(comp_time); - ASN1_ENUMERATED_free(rtmp); - ASN1_TIME_free(revDate); - - return ret; -} - -static int old_entry_print(const ASN1_OBJECT *obj, const ASN1_STRING *str) -{ - char buf[25], *pbuf; - const char *p; - int j; - - j = i2a_ASN1_OBJECT(bio_err, obj); - pbuf = buf; - for (j = 22 - j; j > 0; j--) - *(pbuf++) = ' '; - *(pbuf++) = ':'; - *(pbuf++) = '\0'; - BIO_puts(bio_err, buf); - - if (str->type == V_ASN1_PRINTABLESTRING) - BIO_printf(bio_err, "PRINTABLE:'"); - else if (str->type == V_ASN1_T61STRING) - BIO_printf(bio_err, "T61STRING:'"); - else if (str->type == V_ASN1_IA5STRING) - BIO_printf(bio_err, "IA5STRING:'"); - else if (str->type == V_ASN1_UNIVERSALSTRING) - BIO_printf(bio_err, "UNIVERSALSTRING:'"); - else - BIO_printf(bio_err, "ASN.1 %2d:'", str->type); - - p = (const char *)str->data; - for (j = str->length; j > 0; j--) { - if ((*p >= ' ') && (*p <= '~')) - BIO_printf(bio_err, "%c", *p); - else if (*p & 0x80) - BIO_printf(bio_err, "\\0x%02X", *p); - else if ((unsigned char)*p == 0xf7) - BIO_printf(bio_err, "^?"); - else - BIO_printf(bio_err, "^%c", *p + '@'); - p++; - } - BIO_printf(bio_err, "'\n"); - return 1; -} - -int unpack_revinfo(ASN1_TIME **prevtm, int *preason, ASN1_OBJECT **phold, - ASN1_GENERALIZEDTIME **pinvtm, const char *str) -{ - char *tmp; - char *rtime_str, *reason_str = NULL, *arg_str = NULL, *p; - int reason_code = -1; - int ret = 0; - unsigned int i; - ASN1_OBJECT *hold = NULL; - ASN1_GENERALIZEDTIME *comp_time = NULL; - - tmp = OPENSSL_strdup(str); - if (!tmp) { - BIO_printf(bio_err, "memory allocation failure\n"); - goto end; - } - - p = strchr(tmp, ','); - - rtime_str = tmp; - - if (p) { - *p = '\0'; - p++; - reason_str = p; - p = strchr(p, ','); - if (p) { - *p = '\0'; - arg_str = p + 1; - } - } - - if (prevtm) { - *prevtm = ASN1_UTCTIME_new(); - if (*prevtm == NULL) { - BIO_printf(bio_err, "memory allocation failure\n"); - goto end; - } - if (!ASN1_UTCTIME_set_string(*prevtm, rtime_str)) { - BIO_printf(bio_err, "invalid revocation date %s\n", rtime_str); - goto end; - } - } - if (reason_str) { - for (i = 0; i < NUM_REASONS; i++) { - if (strcasecmp(reason_str, crl_reasons[i]) == 0) { - reason_code = i; - break; - } - } - if (reason_code == OCSP_REVOKED_STATUS_NOSTATUS) { - BIO_printf(bio_err, "invalid reason code %s\n", reason_str); - goto end; - } - - if (reason_code == 7) { - reason_code = OCSP_REVOKED_STATUS_REMOVEFROMCRL; - } else if (reason_code == 8) { /* Hold instruction */ - if (!arg_str) { - BIO_printf(bio_err, "missing hold instruction\n"); - goto end; - } - reason_code = OCSP_REVOKED_STATUS_CERTIFICATEHOLD; - hold = OBJ_txt2obj(arg_str, 0); - - if (!hold) { - BIO_printf(bio_err, "invalid object identifier %s\n", arg_str); - goto end; - } - if (phold) - *phold = hold; - else - ASN1_OBJECT_free(hold); - } else if ((reason_code == 9) || (reason_code == 10)) { - if (!arg_str) { - BIO_printf(bio_err, "missing compromised time\n"); - goto end; - } - comp_time = ASN1_GENERALIZEDTIME_new(); - if (comp_time == NULL) { - BIO_printf(bio_err, "memory allocation failure\n"); - goto end; - } - if (!ASN1_GENERALIZEDTIME_set_string(comp_time, arg_str)) { - BIO_printf(bio_err, "invalid compromised time %s\n", arg_str); - goto end; - } - if (reason_code == 9) - reason_code = OCSP_REVOKED_STATUS_KEYCOMPROMISE; - else - reason_code = OCSP_REVOKED_STATUS_CACOMPROMISE; - } - } - - if (preason) - *preason = reason_code; - if (pinvtm) { - *pinvtm = comp_time; - comp_time = NULL; - } - - ret = 1; - - end: - - OPENSSL_free(tmp); - ASN1_GENERALIZEDTIME_free(comp_time); - - return ret; -} diff --git a/contrib/libs/openssl/apps/ciphers.c b/contrib/libs/openssl/apps/ciphers.c deleted file mode 100644 index 0bb33a4aca..0000000000 --- a/contrib/libs/openssl/apps/ciphers.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/err.h> -#include <openssl/ssl.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_STDNAME, - OPT_CONVERT, - OPT_SSL3, - OPT_TLS1, - OPT_TLS1_1, - OPT_TLS1_2, - OPT_TLS1_3, - OPT_PSK, - OPT_SRP, - OPT_CIPHERSUITES, - OPT_V, OPT_UPPER_V, OPT_S -} OPTION_CHOICE; - -const OPTIONS ciphers_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"v", OPT_V, '-', "Verbose listing of the SSL/TLS ciphers"}, - {"V", OPT_UPPER_V, '-', "Even more verbose"}, - {"s", OPT_S, '-', "Only supported ciphers"}, -#ifndef OPENSSL_NO_SSL3 - {"ssl3", OPT_SSL3, '-', "SSL3 mode"}, -#endif -#ifndef OPENSSL_NO_TLS1 - {"tls1", OPT_TLS1, '-', "TLS1 mode"}, -#endif -#ifndef OPENSSL_NO_TLS1_1 - {"tls1_1", OPT_TLS1_1, '-', "TLS1.1 mode"}, -#endif -#ifndef OPENSSL_NO_TLS1_2 - {"tls1_2", OPT_TLS1_2, '-', "TLS1.2 mode"}, -#endif -#ifndef OPENSSL_NO_TLS1_3 - {"tls1_3", OPT_TLS1_3, '-', "TLS1.3 mode"}, -#endif - {"stdname", OPT_STDNAME, '-', "Show standard cipher names"}, -#ifndef OPENSSL_NO_PSK - {"psk", OPT_PSK, '-', "include ciphersuites requiring PSK"}, -#endif -#ifndef OPENSSL_NO_SRP - {"srp", OPT_SRP, '-', "include ciphersuites requiring SRP"}, -#endif - {"convert", OPT_CONVERT, 's', "Convert standard name into OpenSSL name"}, - {"ciphersuites", OPT_CIPHERSUITES, 's', - "Configure the TLSv1.3 ciphersuites to use"}, - {NULL} -}; - -#ifndef OPENSSL_NO_PSK -static unsigned int dummy_psk(SSL *ssl, const char *hint, char *identity, - unsigned int max_identity_len, - unsigned char *psk, - unsigned int max_psk_len) -{ - return 0; -} -#endif -#ifndef OPENSSL_NO_SRP -static char *dummy_srp(SSL *ssl, void *arg) -{ - return ""; -} -#endif - -int ciphers_main(int argc, char **argv) -{ - SSL_CTX *ctx = NULL; - SSL *ssl = NULL; - STACK_OF(SSL_CIPHER) *sk = NULL; - const SSL_METHOD *meth = TLS_server_method(); - int ret = 1, i, verbose = 0, Verbose = 0, use_supported = 0; - int stdname = 0; -#ifndef OPENSSL_NO_PSK - int psk = 0; -#endif -#ifndef OPENSSL_NO_SRP - int srp = 0; -#endif - const char *p; - char *ciphers = NULL, *prog, *convert = NULL, *ciphersuites = NULL; - char buf[512]; - OPTION_CHOICE o; - int min_version = 0, max_version = 0; - - prog = opt_init(argc, argv, ciphers_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(ciphers_options); - ret = 0; - goto end; - case OPT_V: - verbose = 1; - break; - case OPT_UPPER_V: - verbose = Verbose = 1; - break; - case OPT_S: - use_supported = 1; - break; - case OPT_STDNAME: - stdname = verbose = 1; - break; - case OPT_CONVERT: - convert = opt_arg(); - break; - case OPT_SSL3: - min_version = SSL3_VERSION; - max_version = SSL3_VERSION; - break; - case OPT_TLS1: - min_version = TLS1_VERSION; - max_version = TLS1_VERSION; - break; - case OPT_TLS1_1: - min_version = TLS1_1_VERSION; - max_version = TLS1_1_VERSION; - break; - case OPT_TLS1_2: - min_version = TLS1_2_VERSION; - max_version = TLS1_2_VERSION; - break; - case OPT_TLS1_3: - min_version = TLS1_3_VERSION; - max_version = TLS1_3_VERSION; - break; - case OPT_PSK: -#ifndef OPENSSL_NO_PSK - psk = 1; -#endif - break; - case OPT_SRP: -#ifndef OPENSSL_NO_SRP - srp = 1; -#endif - break; - case OPT_CIPHERSUITES: - ciphersuites = opt_arg(); - break; - } - } - argv = opt_rest(); - argc = opt_num_rest(); - - if (argc == 1) - ciphers = *argv; - else if (argc != 0) - goto opthelp; - - if (convert != NULL) { - BIO_printf(bio_out, "OpenSSL cipher name: %s\n", - OPENSSL_cipher_name(convert)); - goto end; - } - - ctx = SSL_CTX_new(meth); - if (ctx == NULL) - goto err; - if (SSL_CTX_set_min_proto_version(ctx, min_version) == 0) - goto err; - if (SSL_CTX_set_max_proto_version(ctx, max_version) == 0) - goto err; - -#ifndef OPENSSL_NO_PSK - if (psk) - SSL_CTX_set_psk_client_callback(ctx, dummy_psk); -#endif -#ifndef OPENSSL_NO_SRP - if (srp) - SSL_CTX_set_srp_client_pwd_callback(ctx, dummy_srp); -#endif - - if (ciphersuites != NULL && !SSL_CTX_set_ciphersuites(ctx, ciphersuites)) { - BIO_printf(bio_err, "Error setting TLSv1.3 ciphersuites\n"); - goto err; - } - - if (ciphers != NULL) { - if (!SSL_CTX_set_cipher_list(ctx, ciphers)) { - BIO_printf(bio_err, "Error in cipher list\n"); - goto err; - } - } - ssl = SSL_new(ctx); - if (ssl == NULL) - goto err; - - if (use_supported) - sk = SSL_get1_supported_ciphers(ssl); - else - sk = SSL_get_ciphers(ssl); - - if (!verbose) { - for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { - const SSL_CIPHER *c = sk_SSL_CIPHER_value(sk, i); - p = SSL_CIPHER_get_name(c); - if (p == NULL) - break; - if (i != 0) - BIO_printf(bio_out, ":"); - BIO_printf(bio_out, "%s", p); - } - BIO_printf(bio_out, "\n"); - } else { - - for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { - const SSL_CIPHER *c; - - c = sk_SSL_CIPHER_value(sk, i); - - if (Verbose) { - unsigned long id = SSL_CIPHER_get_id(c); - int id0 = (int)(id >> 24); - int id1 = (int)((id >> 16) & 0xffL); - int id2 = (int)((id >> 8) & 0xffL); - int id3 = (int)(id & 0xffL); - - if ((id & 0xff000000L) == 0x03000000L) - BIO_printf(bio_out, " 0x%02X,0x%02X - ", id2, id3); /* SSL3 - * cipher */ - else - BIO_printf(bio_out, "0x%02X,0x%02X,0x%02X,0x%02X - ", id0, id1, id2, id3); /* whatever */ - } - if (stdname) { - const char *nm = SSL_CIPHER_standard_name(c); - if (nm == NULL) - nm = "UNKNOWN"; - BIO_printf(bio_out, "%s - ", nm); - } - BIO_puts(bio_out, SSL_CIPHER_description(c, buf, sizeof(buf))); - } - } - - ret = 0; - goto end; - err: - ERR_print_errors(bio_err); - end: - if (use_supported) - sk_SSL_CIPHER_free(sk); - SSL_CTX_free(ctx); - SSL_free(ssl); - return ret; -} diff --git a/contrib/libs/openssl/apps/cms.c b/contrib/libs/openssl/apps/cms.c deleted file mode 100644 index 71554037d0..0000000000 --- a/contrib/libs/openssl/apps/cms.c +++ /dev/null @@ -1,1292 +0,0 @@ -/* - * Copyright 2008-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* CMS utility function */ - -#include <stdio.h> -#include <string.h> -#include "apps.h" -#include "progs.h" - -#ifndef OPENSSL_NO_CMS - -# include <openssl/crypto.h> -# include <openssl/pem.h> -# include <openssl/err.h> -# include <openssl/x509_vfy.h> -# include <openssl/x509v3.h> -# include <openssl/cms.h> - -static int save_certs(char *signerfile, STACK_OF(X509) *signers); -static int cms_cb(int ok, X509_STORE_CTX *ctx); -static void receipt_request_print(CMS_ContentInfo *cms); -static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) - *rr_to, int rr_allorfirst, STACK_OF(OPENSSL_STRING) - *rr_from); -static int cms_set_pkey_param(EVP_PKEY_CTX *pctx, - STACK_OF(OPENSSL_STRING) *param); - -# define SMIME_OP 0x10 -# define SMIME_IP 0x20 -# define SMIME_SIGNERS 0x40 -# define SMIME_ENCRYPT (1 | SMIME_OP) -# define SMIME_DECRYPT (2 | SMIME_IP) -# define SMIME_SIGN (3 | SMIME_OP | SMIME_SIGNERS) -# define SMIME_VERIFY (4 | SMIME_IP) -# define SMIME_CMSOUT (5 | SMIME_IP | SMIME_OP) -# define SMIME_RESIGN (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS) -# define SMIME_DATAOUT (7 | SMIME_IP) -# define SMIME_DATA_CREATE (8 | SMIME_OP) -# define SMIME_DIGEST_VERIFY (9 | SMIME_IP) -# define SMIME_DIGEST_CREATE (10 | SMIME_OP) -# define SMIME_UNCOMPRESS (11 | SMIME_IP) -# define SMIME_COMPRESS (12 | SMIME_OP) -# define SMIME_ENCRYPTED_DECRYPT (13 | SMIME_IP) -# define SMIME_ENCRYPTED_ENCRYPT (14 | SMIME_OP) -# define SMIME_SIGN_RECEIPT (15 | SMIME_IP | SMIME_OP) -# define SMIME_VERIFY_RECEIPT (16 | SMIME_IP) - -static int verify_err = 0; - -typedef struct cms_key_param_st cms_key_param; - -struct cms_key_param_st { - int idx; - STACK_OF(OPENSSL_STRING) *param; - cms_key_param *next; -}; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_ENCRYPT, - OPT_DECRYPT, OPT_SIGN, OPT_SIGN_RECEIPT, OPT_RESIGN, - OPT_VERIFY, OPT_VERIFY_RETCODE, OPT_VERIFY_RECEIPT, - OPT_CMSOUT, OPT_DATA_OUT, OPT_DATA_CREATE, OPT_DIGEST_VERIFY, - OPT_DIGEST_CREATE, OPT_COMPRESS, OPT_UNCOMPRESS, - OPT_ED_DECRYPT, OPT_ED_ENCRYPT, OPT_DEBUG_DECRYPT, OPT_TEXT, - OPT_ASCIICRLF, OPT_NOINTERN, OPT_NOVERIFY, OPT_NOCERTS, - OPT_NOATTR, OPT_NODETACH, OPT_NOSMIMECAP, OPT_BINARY, OPT_KEYID, - OPT_NOSIGS, OPT_NO_CONTENT_VERIFY, OPT_NO_ATTR_VERIFY, OPT_INDEF, - OPT_NOINDEF, OPT_CRLFEOL, OPT_NOOUT, OPT_RR_PRINT, - OPT_RR_ALL, OPT_RR_FIRST, OPT_RCTFORM, OPT_CERTFILE, OPT_CAFILE, - OPT_CAPATH, OPT_NOCAPATH, OPT_NOCAFILE,OPT_CONTENT, OPT_PRINT, - OPT_SECRETKEY, OPT_SECRETKEYID, OPT_PWRI_PASSWORD, OPT_ECONTENT_TYPE, - OPT_PASSIN, OPT_TO, OPT_FROM, OPT_SUBJECT, OPT_SIGNER, OPT_RECIP, - OPT_CERTSOUT, OPT_MD, OPT_INKEY, OPT_KEYFORM, OPT_KEYOPT, OPT_RR_FROM, - OPT_RR_TO, OPT_AES128_WRAP, OPT_AES192_WRAP, OPT_AES256_WRAP, - OPT_3DES_WRAP, OPT_ENGINE, - OPT_R_ENUM, - OPT_V_ENUM, - OPT_CIPHER -} OPTION_CHOICE; - -const OPTIONS cms_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] cert.pem...\n"}, - {OPT_HELP_STR, 1, '-', - " cert.pem... recipient certs for encryption\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'c', "Input format SMIME (default), PEM or DER"}, - {"outform", OPT_OUTFORM, 'c', - "Output format SMIME (default), PEM or DER"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"encrypt", OPT_ENCRYPT, '-', "Encrypt message"}, - {"decrypt", OPT_DECRYPT, '-', "Decrypt encrypted message"}, - {"sign", OPT_SIGN, '-', "Sign message"}, - {"sign_receipt", OPT_SIGN_RECEIPT, '-', "Generate a signed receipt for the message"}, - {"resign", OPT_RESIGN, '-', "Resign a signed message"}, - {"verify", OPT_VERIFY, '-', "Verify signed message"}, - {"verify_retcode", OPT_VERIFY_RETCODE, '-'}, - {"verify_receipt", OPT_VERIFY_RECEIPT, '<'}, - {"cmsout", OPT_CMSOUT, '-', "Output CMS structure"}, - {"data_out", OPT_DATA_OUT, '-'}, - {"data_create", OPT_DATA_CREATE, '-'}, - {"digest_verify", OPT_DIGEST_VERIFY, '-'}, - {"digest_create", OPT_DIGEST_CREATE, '-'}, - {"compress", OPT_COMPRESS, '-'}, - {"uncompress", OPT_UNCOMPRESS, '-'}, - {"EncryptedData_decrypt", OPT_ED_DECRYPT, '-'}, - {"EncryptedData_encrypt", OPT_ED_ENCRYPT, '-'}, - {"debug_decrypt", OPT_DEBUG_DECRYPT, '-'}, - {"text", OPT_TEXT, '-', "Include or delete text MIME headers"}, - {"asciicrlf", OPT_ASCIICRLF, '-'}, - {"nointern", OPT_NOINTERN, '-', - "Don't search certificates in message for signer"}, - {"noverify", OPT_NOVERIFY, '-', "Don't verify signers certificate"}, - {"nocerts", OPT_NOCERTS, '-', - "Don't include signers certificate when signing"}, - {"noattr", OPT_NOATTR, '-', "Don't include any signed attributes"}, - {"nodetach", OPT_NODETACH, '-', "Use opaque signing"}, - {"nosmimecap", OPT_NOSMIMECAP, '-', "Omit the SMIMECapabilities attribute"}, - {"binary", OPT_BINARY, '-', "Don't translate message to text"}, - {"keyid", OPT_KEYID, '-', "Use subject key identifier"}, - {"nosigs", OPT_NOSIGS, '-', "Don't verify message signature"}, - {"no_content_verify", OPT_NO_CONTENT_VERIFY, '-'}, - {"no_attr_verify", OPT_NO_ATTR_VERIFY, '-'}, - {"stream", OPT_INDEF, '-', "Enable CMS streaming"}, - {"indef", OPT_INDEF, '-', "Same as -stream"}, - {"noindef", OPT_NOINDEF, '-', "Disable CMS streaming"}, - {"crlfeol", OPT_CRLFEOL, '-', "Use CRLF as EOL termination instead of CR only" }, - {"noout", OPT_NOOUT, '-', "For the -cmsout operation do not output the parsed CMS structure"}, - {"receipt_request_print", OPT_RR_PRINT, '-', "Print CMS Receipt Request" }, - {"receipt_request_all", OPT_RR_ALL, '-'}, - {"receipt_request_first", OPT_RR_FIRST, '-'}, - {"rctform", OPT_RCTFORM, 'F', "Receipt file format"}, - {"certfile", OPT_CERTFILE, '<', "Other certificates file"}, - {"CAfile", OPT_CAFILE, '<', "Trusted certificates file"}, - {"CApath", OPT_CAPATH, '/', "trusted certificates directory"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"content", OPT_CONTENT, '<', - "Supply or override content for detached signature"}, - {"print", OPT_PRINT, '-', - "For the -cmsout operation print out all fields of the CMS structure"}, - {"secretkey", OPT_SECRETKEY, 's'}, - {"secretkeyid", OPT_SECRETKEYID, 's'}, - {"pwri_password", OPT_PWRI_PASSWORD, 's'}, - {"econtent_type", OPT_ECONTENT_TYPE, 's'}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"to", OPT_TO, 's', "To address"}, - {"from", OPT_FROM, 's', "From address"}, - {"subject", OPT_SUBJECT, 's', "Subject"}, - {"signer", OPT_SIGNER, 's', "Signer certificate file"}, - {"recip", OPT_RECIP, '<', "Recipient cert file for decryption"}, - {"certsout", OPT_CERTSOUT, '>', "Certificate output file"}, - {"md", OPT_MD, 's', "Digest algorithm to use when signing or resigning"}, - {"inkey", OPT_INKEY, 's', - "Input private key (if not signer or recipient)"}, - {"keyform", OPT_KEYFORM, 'f', "Input private key format (PEM or ENGINE)"}, - {"keyopt", OPT_KEYOPT, 's', "Set public key parameters as n:v pairs"}, - {"receipt_request_from", OPT_RR_FROM, 's'}, - {"receipt_request_to", OPT_RR_TO, 's'}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, - OPT_R_OPTIONS, - OPT_V_OPTIONS, - {"aes128-wrap", OPT_AES128_WRAP, '-', "Use AES128 to wrap key"}, - {"aes192-wrap", OPT_AES192_WRAP, '-', "Use AES192 to wrap key"}, - {"aes256-wrap", OPT_AES256_WRAP, '-', "Use AES256 to wrap key"}, -# ifndef OPENSSL_NO_DES - {"des3-wrap", OPT_3DES_WRAP, '-', "Use 3DES-EDE to wrap key"}, -# endif -# ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine e, possibly a hardware device"}, -# endif - {NULL} -}; - -int cms_main(int argc, char **argv) -{ - ASN1_OBJECT *econtent_type = NULL; - BIO *in = NULL, *out = NULL, *indata = NULL, *rctin = NULL; - CMS_ContentInfo *cms = NULL, *rcms = NULL; - CMS_ReceiptRequest *rr = NULL; - ENGINE *e = NULL; - EVP_PKEY *key = NULL; - const EVP_CIPHER *cipher = NULL, *wrap_cipher = NULL; - const EVP_MD *sign_md = NULL; - STACK_OF(OPENSSL_STRING) *rr_to = NULL, *rr_from = NULL; - STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL; - STACK_OF(X509) *encerts = NULL, *other = NULL; - X509 *cert = NULL, *recip = NULL, *signer = NULL; - X509_STORE *store = NULL; - X509_VERIFY_PARAM *vpm = NULL; - char *certfile = NULL, *keyfile = NULL, *contfile = NULL; - const char *CAfile = NULL, *CApath = NULL; - char *certsoutfile = NULL; - int noCAfile = 0, noCApath = 0; - char *infile = NULL, *outfile = NULL, *rctfile = NULL; - char *passinarg = NULL, *passin = NULL, *signerfile = NULL, *recipfile = NULL; - char *to = NULL, *from = NULL, *subject = NULL, *prog; - cms_key_param *key_first = NULL, *key_param = NULL; - int flags = CMS_DETACHED, noout = 0, print = 0, keyidx = -1, vpmtouched = 0; - int informat = FORMAT_SMIME, outformat = FORMAT_SMIME; - int operation = 0, ret = 1, rr_print = 0, rr_allorfirst = -1; - int verify_retcode = 0, rctformat = FORMAT_SMIME, keyform = FORMAT_PEM; - size_t secret_keylen = 0, secret_keyidlen = 0; - unsigned char *pwri_pass = NULL, *pwri_tmp = NULL; - unsigned char *secret_key = NULL, *secret_keyid = NULL; - long ltmp; - const char *mime_eol = "\n"; - OPTION_CHOICE o; - - if ((vpm = X509_VERIFY_PARAM_new()) == NULL) - return 1; - - prog = opt_init(argc, argv, cms_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(cms_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDS, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDS, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENCRYPT: - operation = SMIME_ENCRYPT; - break; - case OPT_DECRYPT: - operation = SMIME_DECRYPT; - break; - case OPT_SIGN: - operation = SMIME_SIGN; - break; - case OPT_SIGN_RECEIPT: - operation = SMIME_SIGN_RECEIPT; - break; - case OPT_RESIGN: - operation = SMIME_RESIGN; - break; - case OPT_VERIFY: - operation = SMIME_VERIFY; - break; - case OPT_VERIFY_RETCODE: - verify_retcode = 1; - break; - case OPT_VERIFY_RECEIPT: - operation = SMIME_VERIFY_RECEIPT; - rctfile = opt_arg(); - break; - case OPT_CMSOUT: - operation = SMIME_CMSOUT; - break; - case OPT_DATA_OUT: - operation = SMIME_DATAOUT; - break; - case OPT_DATA_CREATE: - operation = SMIME_DATA_CREATE; - break; - case OPT_DIGEST_VERIFY: - operation = SMIME_DIGEST_VERIFY; - break; - case OPT_DIGEST_CREATE: - operation = SMIME_DIGEST_CREATE; - break; - case OPT_COMPRESS: - operation = SMIME_COMPRESS; - break; - case OPT_UNCOMPRESS: - operation = SMIME_UNCOMPRESS; - break; - case OPT_ED_DECRYPT: - operation = SMIME_ENCRYPTED_DECRYPT; - break; - case OPT_ED_ENCRYPT: - operation = SMIME_ENCRYPTED_ENCRYPT; - break; - case OPT_DEBUG_DECRYPT: - flags |= CMS_DEBUG_DECRYPT; - break; - case OPT_TEXT: - flags |= CMS_TEXT; - break; - case OPT_ASCIICRLF: - flags |= CMS_ASCIICRLF; - break; - case OPT_NOINTERN: - flags |= CMS_NOINTERN; - break; - case OPT_NOVERIFY: - flags |= CMS_NO_SIGNER_CERT_VERIFY; - break; - case OPT_NOCERTS: - flags |= CMS_NOCERTS; - break; - case OPT_NOATTR: - flags |= CMS_NOATTR; - break; - case OPT_NODETACH: - flags &= ~CMS_DETACHED; - break; - case OPT_NOSMIMECAP: - flags |= CMS_NOSMIMECAP; - break; - case OPT_BINARY: - flags |= CMS_BINARY; - break; - case OPT_KEYID: - flags |= CMS_USE_KEYID; - break; - case OPT_NOSIGS: - flags |= CMS_NOSIGS; - break; - case OPT_NO_CONTENT_VERIFY: - flags |= CMS_NO_CONTENT_VERIFY; - break; - case OPT_NO_ATTR_VERIFY: - flags |= CMS_NO_ATTR_VERIFY; - break; - case OPT_INDEF: - flags |= CMS_STREAM; - break; - case OPT_NOINDEF: - flags &= ~CMS_STREAM; - break; - case OPT_CRLFEOL: - mime_eol = "\r\n"; - flags |= CMS_CRLFEOL; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_RR_PRINT: - rr_print = 1; - break; - case OPT_RR_ALL: - rr_allorfirst = 0; - break; - case OPT_RR_FIRST: - rr_allorfirst = 1; - break; - case OPT_RCTFORM: - if (rctformat == FORMAT_SMIME) - rcms = SMIME_read_CMS(rctin, NULL); - else if (rctformat == FORMAT_PEM) - rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL); - else if (rctformat == FORMAT_ASN1) - if (!opt_format(opt_arg(), - OPT_FMT_PEMDER | OPT_FMT_SMIME, &rctformat)) - goto opthelp; - break; - case OPT_CERTFILE: - certfile = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_CONTENT: - contfile = opt_arg(); - break; - case OPT_RR_FROM: - if (rr_from == NULL - && (rr_from = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(rr_from, opt_arg()); - break; - case OPT_RR_TO: - if (rr_to == NULL - && (rr_to = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(rr_to, opt_arg()); - break; - case OPT_PRINT: - noout = print = 1; - break; - case OPT_SECRETKEY: - if (secret_key != NULL) { - BIO_printf(bio_err, "Invalid key (supplied twice) %s\n", - opt_arg()); - goto opthelp; - } - secret_key = OPENSSL_hexstr2buf(opt_arg(), <mp); - if (secret_key == NULL) { - BIO_printf(bio_err, "Invalid key %s\n", opt_arg()); - goto end; - } - secret_keylen = (size_t)ltmp; - break; - case OPT_SECRETKEYID: - if (secret_keyid != NULL) { - BIO_printf(bio_err, "Invalid id (supplied twice) %s\n", - opt_arg()); - goto opthelp; - } - secret_keyid = OPENSSL_hexstr2buf(opt_arg(), <mp); - if (secret_keyid == NULL) { - BIO_printf(bio_err, "Invalid id %s\n", opt_arg()); - goto opthelp; - } - secret_keyidlen = (size_t)ltmp; - break; - case OPT_PWRI_PASSWORD: - pwri_pass = (unsigned char *)opt_arg(); - break; - case OPT_ECONTENT_TYPE: - if (econtent_type != NULL) { - BIO_printf(bio_err, "Invalid OID (supplied twice) %s\n", - opt_arg()); - goto opthelp; - } - econtent_type = OBJ_txt2obj(opt_arg(), 0); - if (econtent_type == NULL) { - BIO_printf(bio_err, "Invalid OID %s\n", opt_arg()); - goto opthelp; - } - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_TO: - to = opt_arg(); - break; - case OPT_FROM: - from = opt_arg(); - break; - case OPT_SUBJECT: - subject = opt_arg(); - break; - case OPT_CERTSOUT: - certsoutfile = opt_arg(); - break; - case OPT_MD: - if (!opt_md(opt_arg(), &sign_md)) - goto end; - break; - case OPT_SIGNER: - /* If previous -signer argument add signer to list */ - if (signerfile != NULL) { - if (sksigners == NULL - && (sksigners = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(sksigners, signerfile); - if (keyfile == NULL) - keyfile = signerfile; - if (skkeys == NULL - && (skkeys = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(skkeys, keyfile); - keyfile = NULL; - } - signerfile = opt_arg(); - break; - case OPT_INKEY: - /* If previous -inkey argument add signer to list */ - if (keyfile != NULL) { - if (signerfile == NULL) { - BIO_puts(bio_err, "Illegal -inkey without -signer\n"); - goto end; - } - if (sksigners == NULL - && (sksigners = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(sksigners, signerfile); - signerfile = NULL; - if (skkeys == NULL - && (skkeys = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(skkeys, keyfile); - } - keyfile = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyform)) - goto opthelp; - break; - case OPT_RECIP: - if (operation == SMIME_ENCRYPT) { - if (encerts == NULL && (encerts = sk_X509_new_null()) == NULL) - goto end; - cert = load_cert(opt_arg(), FORMAT_PEM, - "recipient certificate file"); - if (cert == NULL) - goto end; - sk_X509_push(encerts, cert); - cert = NULL; - } else { - recipfile = opt_arg(); - } - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &cipher)) - goto end; - break; - case OPT_KEYOPT: - keyidx = -1; - if (operation == SMIME_ENCRYPT) { - if (encerts != NULL) - keyidx += sk_X509_num(encerts); - } else { - if (keyfile != NULL || signerfile != NULL) - keyidx++; - if (skkeys != NULL) - keyidx += sk_OPENSSL_STRING_num(skkeys); - } - if (keyidx < 0) { - BIO_printf(bio_err, "No key specified\n"); - goto opthelp; - } - if (key_param == NULL || key_param->idx != keyidx) { - cms_key_param *nparam; - nparam = app_malloc(sizeof(*nparam), "key param buffer"); - if ((nparam->param = sk_OPENSSL_STRING_new_null()) == NULL) { - OPENSSL_free(nparam); - goto end; - } - nparam->idx = keyidx; - nparam->next = NULL; - if (key_first == NULL) - key_first = nparam; - else - key_param->next = nparam; - key_param = nparam; - } - sk_OPENSSL_STRING_push(key_param->param, opt_arg()); - break; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto end; - vpmtouched++; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_3DES_WRAP: -# ifndef OPENSSL_NO_DES - wrap_cipher = EVP_des_ede3_wrap(); -# endif - break; - case OPT_AES128_WRAP: - wrap_cipher = EVP_aes_128_wrap(); - break; - case OPT_AES192_WRAP: - wrap_cipher = EVP_aes_192_wrap(); - break; - case OPT_AES256_WRAP: - wrap_cipher = EVP_aes_256_wrap(); - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if ((rr_allorfirst != -1 || rr_from != NULL) && rr_to == NULL) { - BIO_puts(bio_err, "No Signed Receipts Recipients\n"); - goto opthelp; - } - - if (!(operation & SMIME_SIGNERS) && (rr_to != NULL || rr_from != NULL)) { - BIO_puts(bio_err, "Signed receipts only allowed with -sign\n"); - goto opthelp; - } - if (!(operation & SMIME_SIGNERS) && (skkeys != NULL || sksigners != NULL)) { - BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); - goto opthelp; - } - - if (operation & SMIME_SIGNERS) { - if (keyfile != NULL && signerfile == NULL) { - BIO_puts(bio_err, "Illegal -inkey without -signer\n"); - goto opthelp; - } - /* Check to see if any final signer needs to be appended */ - if (signerfile != NULL) { - if (sksigners == NULL - && (sksigners = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(sksigners, signerfile); - if (skkeys == NULL && (skkeys = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - if (keyfile == NULL) - keyfile = signerfile; - sk_OPENSSL_STRING_push(skkeys, keyfile); - } - if (sksigners == NULL) { - BIO_printf(bio_err, "No signer certificate specified\n"); - goto opthelp; - } - signerfile = NULL; - keyfile = NULL; - } else if (operation == SMIME_DECRYPT) { - if (recipfile == NULL && keyfile == NULL - && secret_key == NULL && pwri_pass == NULL) { - BIO_printf(bio_err, - "No recipient certificate or key specified\n"); - goto opthelp; - } - } else if (operation == SMIME_ENCRYPT) { - if (*argv == NULL && secret_key == NULL - && pwri_pass == NULL && encerts == NULL) { - BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n"); - goto opthelp; - } - } else if (!operation) { - BIO_printf(bio_err, "No operation option (-encrypt|-decrypt|-sign|-verify|...) specified.\n"); - goto opthelp; - } - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - ret = 2; - - if (!(operation & SMIME_SIGNERS)) - flags &= ~CMS_DETACHED; - - if (!(operation & SMIME_OP)) - if (flags & CMS_BINARY) - outformat = FORMAT_BINARY; - - if (!(operation & SMIME_IP)) - if (flags & CMS_BINARY) - informat = FORMAT_BINARY; - - if (operation == SMIME_ENCRYPT) { - if (!cipher) { -# ifndef OPENSSL_NO_DES - cipher = EVP_des_ede3_cbc(); -# else - BIO_printf(bio_err, "No cipher selected\n"); - goto end; -# endif - } - - if (secret_key && !secret_keyid) { - BIO_printf(bio_err, "No secret key id\n"); - goto end; - } - - if (*argv && encerts == NULL) - if ((encerts = sk_X509_new_null()) == NULL) - goto end; - while (*argv) { - if ((cert = load_cert(*argv, FORMAT_PEM, - "recipient certificate file")) == NULL) - goto end; - sk_X509_push(encerts, cert); - cert = NULL; - argv++; - } - } - - if (certfile != NULL) { - if (!load_certs(certfile, &other, FORMAT_PEM, NULL, - "certificate file")) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (recipfile != NULL && (operation == SMIME_DECRYPT)) { - if ((recip = load_cert(recipfile, FORMAT_PEM, - "recipient certificate file")) == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (operation == SMIME_SIGN_RECEIPT) { - if ((signer = load_cert(signerfile, FORMAT_PEM, - "receipt signer certificate file")) == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (operation == SMIME_DECRYPT) { - if (keyfile == NULL) - keyfile = recipfile; - } else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT)) { - if (keyfile == NULL) - keyfile = signerfile; - } else { - keyfile = NULL; - } - - if (keyfile != NULL) { - key = load_key(keyfile, keyform, 0, passin, e, "signing key file"); - if (key == NULL) - goto end; - } - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - - if (operation & SMIME_IP) { - if (informat == FORMAT_SMIME) { - cms = SMIME_read_CMS(in, &indata); - } else if (informat == FORMAT_PEM) { - cms = PEM_read_bio_CMS(in, NULL, NULL, NULL); - } else if (informat == FORMAT_ASN1) { - cms = d2i_CMS_bio(in, NULL); - } else { - BIO_printf(bio_err, "Bad input format for CMS file\n"); - goto end; - } - - if (cms == NULL) { - BIO_printf(bio_err, "Error reading S/MIME message\n"); - goto end; - } - if (contfile != NULL) { - BIO_free(indata); - if ((indata = BIO_new_file(contfile, "rb")) == NULL) { - BIO_printf(bio_err, "Can't read content file %s\n", contfile); - goto end; - } - } - if (certsoutfile != NULL) { - STACK_OF(X509) *allcerts; - allcerts = CMS_get1_certs(cms); - if (!save_certs(certsoutfile, allcerts)) { - BIO_printf(bio_err, - "Error writing certs to %s\n", certsoutfile); - ret = 5; - goto end; - } - sk_X509_pop_free(allcerts, X509_free); - } - } - - if (rctfile != NULL) { - char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r"; - if ((rctin = BIO_new_file(rctfile, rctmode)) == NULL) { - BIO_printf(bio_err, "Can't open receipt file %s\n", rctfile); - goto end; - } - - if (rctformat == FORMAT_SMIME) { - rcms = SMIME_read_CMS(rctin, NULL); - } else if (rctformat == FORMAT_PEM) { - rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL); - } else if (rctformat == FORMAT_ASN1) { - rcms = d2i_CMS_bio(rctin, NULL); - } else { - BIO_printf(bio_err, "Bad input format for receipt\n"); - goto end; - } - - if (rcms == NULL) { - BIO_printf(bio_err, "Error reading receipt\n"); - goto end; - } - } - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT)) { - if ((store = setup_verify(CAfile, CApath, noCAfile, noCApath)) == NULL) - goto end; - X509_STORE_set_verify_cb(store, cms_cb); - if (vpmtouched) - X509_STORE_set1_param(store, vpm); - } - - ret = 3; - - if (operation == SMIME_DATA_CREATE) { - cms = CMS_data_create(in, flags); - } else if (operation == SMIME_DIGEST_CREATE) { - cms = CMS_digest_create(in, sign_md, flags); - } else if (operation == SMIME_COMPRESS) { - cms = CMS_compress(in, -1, flags); - } else if (operation == SMIME_ENCRYPT) { - int i; - flags |= CMS_PARTIAL; - cms = CMS_encrypt(NULL, in, cipher, flags); - if (cms == NULL) - goto end; - for (i = 0; i < sk_X509_num(encerts); i++) { - CMS_RecipientInfo *ri; - cms_key_param *kparam; - int tflags = flags; - X509 *x = sk_X509_value(encerts, i); - for (kparam = key_first; kparam; kparam = kparam->next) { - if (kparam->idx == i) { - tflags |= CMS_KEY_PARAM; - break; - } - } - ri = CMS_add1_recipient_cert(cms, x, tflags); - if (ri == NULL) - goto end; - if (kparam != NULL) { - EVP_PKEY_CTX *pctx; - pctx = CMS_RecipientInfo_get0_pkey_ctx(ri); - if (!cms_set_pkey_param(pctx, kparam->param)) - goto end; - } - if (CMS_RecipientInfo_type(ri) == CMS_RECIPINFO_AGREE - && wrap_cipher) { - EVP_CIPHER_CTX *wctx; - wctx = CMS_RecipientInfo_kari_get0_ctx(ri); - EVP_EncryptInit_ex(wctx, wrap_cipher, NULL, NULL, NULL); - } - } - - if (secret_key != NULL) { - if (!CMS_add0_recipient_key(cms, NID_undef, - secret_key, secret_keylen, - secret_keyid, secret_keyidlen, - NULL, NULL, NULL)) - goto end; - /* NULL these because call absorbs them */ - secret_key = NULL; - secret_keyid = NULL; - } - if (pwri_pass != NULL) { - pwri_tmp = (unsigned char *)OPENSSL_strdup((char *)pwri_pass); - if (pwri_tmp == NULL) - goto end; - if (CMS_add0_recipient_password(cms, - -1, NID_undef, NID_undef, - pwri_tmp, -1, NULL) == NULL) - goto end; - pwri_tmp = NULL; - } - if (!(flags & CMS_STREAM)) { - if (!CMS_final(cms, in, NULL, flags)) - goto end; - } - } else if (operation == SMIME_ENCRYPTED_ENCRYPT) { - cms = CMS_EncryptedData_encrypt(in, cipher, - secret_key, secret_keylen, flags); - - } else if (operation == SMIME_SIGN_RECEIPT) { - CMS_ContentInfo *srcms = NULL; - STACK_OF(CMS_SignerInfo) *sis; - CMS_SignerInfo *si; - sis = CMS_get0_SignerInfos(cms); - if (sis == NULL) - goto end; - si = sk_CMS_SignerInfo_value(sis, 0); - srcms = CMS_sign_receipt(si, signer, key, other, flags); - if (srcms == NULL) - goto end; - CMS_ContentInfo_free(cms); - cms = srcms; - } else if (operation & SMIME_SIGNERS) { - int i; - /* - * If detached data content we enable streaming if S/MIME output - * format. - */ - if (operation == SMIME_SIGN) { - - if (flags & CMS_DETACHED) { - if (outformat == FORMAT_SMIME) - flags |= CMS_STREAM; - } - flags |= CMS_PARTIAL; - cms = CMS_sign(NULL, NULL, other, in, flags); - if (cms == NULL) - goto end; - if (econtent_type != NULL) - CMS_set1_eContentType(cms, econtent_type); - - if (rr_to != NULL) { - rr = make_receipt_request(rr_to, rr_allorfirst, rr_from); - if (rr == NULL) { - BIO_puts(bio_err, - "Signed Receipt Request Creation Error\n"); - goto end; - } - } - } else { - flags |= CMS_REUSE_DIGEST; - } - for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) { - CMS_SignerInfo *si; - cms_key_param *kparam; - int tflags = flags; - signerfile = sk_OPENSSL_STRING_value(sksigners, i); - keyfile = sk_OPENSSL_STRING_value(skkeys, i); - - signer = load_cert(signerfile, FORMAT_PEM, "signer certificate"); - if (signer == NULL) { - ret = 2; - goto end; - } - key = load_key(keyfile, keyform, 0, passin, e, "signing key file"); - if (key == NULL) { - ret = 2; - goto end; - } - for (kparam = key_first; kparam; kparam = kparam->next) { - if (kparam->idx == i) { - tflags |= CMS_KEY_PARAM; - break; - } - } - si = CMS_add1_signer(cms, signer, key, sign_md, tflags); - if (si == NULL) - goto end; - if (kparam != NULL) { - EVP_PKEY_CTX *pctx; - pctx = CMS_SignerInfo_get0_pkey_ctx(si); - if (!cms_set_pkey_param(pctx, kparam->param)) - goto end; - } - if (rr != NULL && !CMS_add1_ReceiptRequest(si, rr)) - goto end; - X509_free(signer); - signer = NULL; - EVP_PKEY_free(key); - key = NULL; - } - /* If not streaming or resigning finalize structure */ - if ((operation == SMIME_SIGN) && !(flags & CMS_STREAM)) { - if (!CMS_final(cms, in, NULL, flags)) - goto end; - } - } - - if (cms == NULL) { - BIO_printf(bio_err, "Error creating CMS structure\n"); - goto end; - } - - ret = 4; - if (operation == SMIME_DECRYPT) { - if (flags & CMS_DEBUG_DECRYPT) - CMS_decrypt(cms, NULL, NULL, NULL, NULL, flags); - - if (secret_key != NULL) { - if (!CMS_decrypt_set1_key(cms, - secret_key, secret_keylen, - secret_keyid, secret_keyidlen)) { - BIO_puts(bio_err, "Error decrypting CMS using secret key\n"); - goto end; - } - } - - if (key != NULL) { - if (!CMS_decrypt_set1_pkey(cms, key, recip)) { - BIO_puts(bio_err, "Error decrypting CMS using private key\n"); - goto end; - } - } - - if (pwri_pass != NULL) { - if (!CMS_decrypt_set1_password(cms, pwri_pass, -1)) { - BIO_puts(bio_err, "Error decrypting CMS using password\n"); - goto end; - } - } - - if (!CMS_decrypt(cms, NULL, NULL, indata, out, flags)) { - BIO_printf(bio_err, "Error decrypting CMS structure\n"); - goto end; - } - } else if (operation == SMIME_DATAOUT) { - if (!CMS_data(cms, out, flags)) - goto end; - } else if (operation == SMIME_UNCOMPRESS) { - if (!CMS_uncompress(cms, indata, out, flags)) - goto end; - } else if (operation == SMIME_DIGEST_VERIFY) { - if (CMS_digest_verify(cms, indata, out, flags) > 0) { - BIO_printf(bio_err, "Verification successful\n"); - } else { - BIO_printf(bio_err, "Verification failure\n"); - goto end; - } - } else if (operation == SMIME_ENCRYPTED_DECRYPT) { - if (!CMS_EncryptedData_decrypt(cms, secret_key, secret_keylen, - indata, out, flags)) - goto end; - } else if (operation == SMIME_VERIFY) { - if (CMS_verify(cms, other, store, indata, out, flags) > 0) { - BIO_printf(bio_err, "Verification successful\n"); - } else { - BIO_printf(bio_err, "Verification failure\n"); - if (verify_retcode) - ret = verify_err + 32; - goto end; - } - if (signerfile != NULL) { - STACK_OF(X509) *signers; - signers = CMS_get0_signers(cms); - if (!save_certs(signerfile, signers)) { - BIO_printf(bio_err, - "Error writing signers to %s\n", signerfile); - ret = 5; - goto end; - } - sk_X509_free(signers); - } - if (rr_print) - receipt_request_print(cms); - - } else if (operation == SMIME_VERIFY_RECEIPT) { - if (CMS_verify_receipt(rcms, cms, other, store, flags) > 0) { - BIO_printf(bio_err, "Verification successful\n"); - } else { - BIO_printf(bio_err, "Verification failure\n"); - goto end; - } - } else { - if (noout) { - if (print) - CMS_ContentInfo_print_ctx(out, cms, 0, NULL); - } else if (outformat == FORMAT_SMIME) { - if (to) - BIO_printf(out, "To: %s%s", to, mime_eol); - if (from) - BIO_printf(out, "From: %s%s", from, mime_eol); - if (subject) - BIO_printf(out, "Subject: %s%s", subject, mime_eol); - if (operation == SMIME_RESIGN) - ret = SMIME_write_CMS(out, cms, indata, flags); - else - ret = SMIME_write_CMS(out, cms, in, flags); - } else if (outformat == FORMAT_PEM) { - ret = PEM_write_bio_CMS_stream(out, cms, in, flags); - } else if (outformat == FORMAT_ASN1) { - ret = i2d_CMS_bio_stream(out, cms, in, flags); - } else { - BIO_printf(bio_err, "Bad output format for CMS file\n"); - goto end; - } - if (ret <= 0) { - ret = 6; - goto end; - } - } - ret = 0; - end: - if (ret) - ERR_print_errors(bio_err); - sk_X509_pop_free(encerts, X509_free); - sk_X509_pop_free(other, X509_free); - X509_VERIFY_PARAM_free(vpm); - sk_OPENSSL_STRING_free(sksigners); - sk_OPENSSL_STRING_free(skkeys); - OPENSSL_free(secret_key); - OPENSSL_free(secret_keyid); - OPENSSL_free(pwri_tmp); - ASN1_OBJECT_free(econtent_type); - CMS_ReceiptRequest_free(rr); - sk_OPENSSL_STRING_free(rr_to); - sk_OPENSSL_STRING_free(rr_from); - for (key_param = key_first; key_param;) { - cms_key_param *tparam; - sk_OPENSSL_STRING_free(key_param->param); - tparam = key_param->next; - OPENSSL_free(key_param); - key_param = tparam; - } - X509_STORE_free(store); - X509_free(cert); - X509_free(recip); - X509_free(signer); - EVP_PKEY_free(key); - CMS_ContentInfo_free(cms); - CMS_ContentInfo_free(rcms); - release_engine(e); - BIO_free(rctin); - BIO_free(in); - BIO_free(indata); - BIO_free_all(out); - OPENSSL_free(passin); - return ret; -} - -static int save_certs(char *signerfile, STACK_OF(X509) *signers) -{ - int i; - BIO *tmp; - if (signerfile == NULL) - return 1; - tmp = BIO_new_file(signerfile, "w"); - if (tmp == NULL) - return 0; - for (i = 0; i < sk_X509_num(signers); i++) - PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); - BIO_free(tmp); - return 1; -} - -/* Minimal callback just to output policy info (if any) */ - -static int cms_cb(int ok, X509_STORE_CTX *ctx) -{ - int error; - - error = X509_STORE_CTX_get_error(ctx); - - verify_err = error; - - if ((error != X509_V_ERR_NO_EXPLICIT_POLICY) - && ((error != X509_V_OK) || (ok != 2))) - return ok; - - policies_print(ctx); - - return ok; - -} - -static void gnames_stack_print(STACK_OF(GENERAL_NAMES) *gns) -{ - STACK_OF(GENERAL_NAME) *gens; - GENERAL_NAME *gen; - int i, j; - - for (i = 0; i < sk_GENERAL_NAMES_num(gns); i++) { - gens = sk_GENERAL_NAMES_value(gns, i); - for (j = 0; j < sk_GENERAL_NAME_num(gens); j++) { - gen = sk_GENERAL_NAME_value(gens, j); - BIO_puts(bio_err, " "); - GENERAL_NAME_print(bio_err, gen); - BIO_puts(bio_err, "\n"); - } - } - return; -} - -static void receipt_request_print(CMS_ContentInfo *cms) -{ - STACK_OF(CMS_SignerInfo) *sis; - CMS_SignerInfo *si; - CMS_ReceiptRequest *rr; - int allorfirst; - STACK_OF(GENERAL_NAMES) *rto, *rlist; - ASN1_STRING *scid; - int i, rv; - sis = CMS_get0_SignerInfos(cms); - for (i = 0; i < sk_CMS_SignerInfo_num(sis); i++) { - si = sk_CMS_SignerInfo_value(sis, i); - rv = CMS_get1_ReceiptRequest(si, &rr); - BIO_printf(bio_err, "Signer %d:\n", i + 1); - if (rv == 0) { - BIO_puts(bio_err, " No Receipt Request\n"); - } else if (rv < 0) { - BIO_puts(bio_err, " Receipt Request Parse Error\n"); - ERR_print_errors(bio_err); - } else { - const char *id; - int idlen; - CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst, - &rlist, &rto); - BIO_puts(bio_err, " Signed Content ID:\n"); - idlen = ASN1_STRING_length(scid); - id = (const char *)ASN1_STRING_get0_data(scid); - BIO_dump_indent(bio_err, id, idlen, 4); - BIO_puts(bio_err, " Receipts From"); - if (rlist != NULL) { - BIO_puts(bio_err, " List:\n"); - gnames_stack_print(rlist); - } else if (allorfirst == 1) { - BIO_puts(bio_err, ": First Tier\n"); - } else if (allorfirst == 0) { - BIO_puts(bio_err, ": All\n"); - } else { - BIO_printf(bio_err, " Unknown (%d)\n", allorfirst); - } - BIO_puts(bio_err, " Receipts To:\n"); - gnames_stack_print(rto); - } - CMS_ReceiptRequest_free(rr); - } -} - -static STACK_OF(GENERAL_NAMES) *make_names_stack(STACK_OF(OPENSSL_STRING) *ns) -{ - int i; - STACK_OF(GENERAL_NAMES) *ret; - GENERAL_NAMES *gens = NULL; - GENERAL_NAME *gen = NULL; - ret = sk_GENERAL_NAMES_new_null(); - if (ret == NULL) - goto err; - for (i = 0; i < sk_OPENSSL_STRING_num(ns); i++) { - char *str = sk_OPENSSL_STRING_value(ns, i); - gen = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_EMAIL, str, 0); - if (gen == NULL) - goto err; - gens = GENERAL_NAMES_new(); - if (gens == NULL) - goto err; - if (!sk_GENERAL_NAME_push(gens, gen)) - goto err; - gen = NULL; - if (!sk_GENERAL_NAMES_push(ret, gens)) - goto err; - gens = NULL; - } - - return ret; - - err: - sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free); - GENERAL_NAMES_free(gens); - GENERAL_NAME_free(gen); - return NULL; -} - -static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) - *rr_to, int rr_allorfirst, STACK_OF(OPENSSL_STRING) - *rr_from) -{ - STACK_OF(GENERAL_NAMES) *rct_to = NULL, *rct_from = NULL; - CMS_ReceiptRequest *rr; - rct_to = make_names_stack(rr_to); - if (rct_to == NULL) - goto err; - if (rr_from != NULL) { - rct_from = make_names_stack(rr_from); - if (rct_from == NULL) - goto err; - } else { - rct_from = NULL; - } - rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from, - rct_to); - return rr; - err: - sk_GENERAL_NAMES_pop_free(rct_to, GENERAL_NAMES_free); - return NULL; -} - -static int cms_set_pkey_param(EVP_PKEY_CTX *pctx, - STACK_OF(OPENSSL_STRING) *param) -{ - char *keyopt; - int i; - if (sk_OPENSSL_STRING_num(param) <= 0) - return 1; - for (i = 0; i < sk_OPENSSL_STRING_num(param); i++) { - keyopt = sk_OPENSSL_STRING_value(param, i); - if (pkey_ctrl_string(pctx, keyopt) <= 0) { - BIO_printf(bio_err, "parameter error \"%s\"\n", keyopt); - ERR_print_errors(bio_err); - return 0; - } - } - return 1; -} - -#endif diff --git a/contrib/libs/openssl/apps/crl.c b/contrib/libs/openssl/apps/crl.c deleted file mode 100644 index 031fada14c..0000000000 --- a/contrib/libs/openssl/apps/crl.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/pem.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_IN, OPT_OUTFORM, OPT_OUT, OPT_KEYFORM, OPT_KEY, - OPT_ISSUER, OPT_LASTUPDATE, OPT_NEXTUPDATE, OPT_FINGERPRINT, - OPT_CRLNUMBER, OPT_BADSIG, OPT_GENDELTA, OPT_CAPATH, OPT_CAFILE, - OPT_NOCAPATH, OPT_NOCAFILE, OPT_VERIFY, OPT_TEXT, OPT_HASH, OPT_HASH_OLD, - OPT_NOOUT, OPT_NAMEOPT, OPT_MD -} OPTION_CHOICE; - -const OPTIONS crl_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format; default PEM"}, - {"in", OPT_IN, '<', "Input file - default stdin"}, - {"outform", OPT_OUTFORM, 'F', "Output format - default PEM"}, - {"out", OPT_OUT, '>', "output file - default stdout"}, - {"keyform", OPT_KEYFORM, 'F', "Private key file format (PEM or ENGINE)"}, - {"key", OPT_KEY, '<', "CRL signing Private key to use"}, - {"issuer", OPT_ISSUER, '-', "Print issuer DN"}, - {"lastupdate", OPT_LASTUPDATE, '-', "Set lastUpdate field"}, - {"nextupdate", OPT_NEXTUPDATE, '-', "Set nextUpdate field"}, - {"noout", OPT_NOOUT, '-', "No CRL output"}, - {"fingerprint", OPT_FINGERPRINT, '-', "Print the crl fingerprint"}, - {"crlnumber", OPT_CRLNUMBER, '-', "Print CRL number"}, - {"badsig", OPT_BADSIG, '-', "Corrupt last byte of loaded CRL signature (for test)" }, - {"gendelta", OPT_GENDELTA, '<', "Other CRL to compare/diff to the Input one"}, - {"CApath", OPT_CAPATH, '/', "Verify CRL using certificates in dir"}, - {"CAfile", OPT_CAFILE, '<', "Verify CRL using certificates in file name"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"verify", OPT_VERIFY, '-', "Verify CRL signature"}, - {"text", OPT_TEXT, '-', "Print out a text format version"}, - {"hash", OPT_HASH, '-', "Print hash value"}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - {"", OPT_MD, '-', "Any supported digest"}, -#ifndef OPENSSL_NO_MD5 - {"hash_old", OPT_HASH_OLD, '-', "Print old-style (MD5) hash value"}, -#endif - {NULL} -}; - -int crl_main(int argc, char **argv) -{ - X509_CRL *x = NULL; - BIO *out = NULL; - X509_STORE *store = NULL; - X509_STORE_CTX *ctx = NULL; - X509_LOOKUP *lookup = NULL; - X509_OBJECT *xobj = NULL; - EVP_PKEY *pkey; - const EVP_MD *digest = EVP_sha1(); - char *infile = NULL, *outfile = NULL, *crldiff = NULL, *keyfile = NULL; - const char *CAfile = NULL, *CApath = NULL, *prog; - OPTION_CHOICE o; - int hash = 0, issuer = 0, lastupdate = 0, nextupdate = 0, noout = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, keyformat = FORMAT_PEM; - int ret = 1, num = 0, badsig = 0, fingerprint = 0, crlnumber = 0; - int text = 0, do_ver = 0, noCAfile = 0, noCApath = 0; - int i; -#ifndef OPENSSL_NO_MD5 - int hash_old = 0; -#endif - - prog = opt_init(argc, argv, crl_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(crl_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &keyformat)) - goto opthelp; - break; - case OPT_KEY: - keyfile = opt_arg(); - break; - case OPT_GENDELTA: - crldiff = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - do_ver = 1; - break; - case OPT_CAFILE: - CAfile = opt_arg(); - do_ver = 1; - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_HASH_OLD: -#ifndef OPENSSL_NO_MD5 - hash_old = ++num; -#endif - break; - case OPT_VERIFY: - do_ver = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_HASH: - hash = ++num; - break; - case OPT_ISSUER: - issuer = ++num; - break; - case OPT_LASTUPDATE: - lastupdate = ++num; - break; - case OPT_NEXTUPDATE: - nextupdate = ++num; - break; - case OPT_NOOUT: - noout = ++num; - break; - case OPT_FINGERPRINT: - fingerprint = ++num; - break; - case OPT_CRLNUMBER: - crlnumber = ++num; - break; - case OPT_BADSIG: - badsig = 1; - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto opthelp; - break; - case OPT_MD: - if (!opt_md(opt_unknown(), &digest)) - goto opthelp; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - x = load_crl(infile, informat); - if (x == NULL) - goto end; - - if (do_ver) { - if ((store = setup_verify(CAfile, CApath, noCAfile, noCApath)) == NULL) - goto end; - lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); - if (lookup == NULL) - goto end; - ctx = X509_STORE_CTX_new(); - if (ctx == NULL || !X509_STORE_CTX_init(ctx, store, NULL, NULL)) { - BIO_printf(bio_err, "Error initialising X509 store\n"); - goto end; - } - - xobj = X509_STORE_CTX_get_obj_by_subject(ctx, X509_LU_X509, - X509_CRL_get_issuer(x)); - if (xobj == NULL) { - BIO_printf(bio_err, "Error getting CRL issuer certificate\n"); - goto end; - } - pkey = X509_get_pubkey(X509_OBJECT_get0_X509(xobj)); - X509_OBJECT_free(xobj); - if (!pkey) { - BIO_printf(bio_err, "Error getting CRL issuer public key\n"); - goto end; - } - i = X509_CRL_verify(x, pkey); - EVP_PKEY_free(pkey); - if (i < 0) - goto end; - if (i == 0) - BIO_printf(bio_err, "verify failure\n"); - else - BIO_printf(bio_err, "verify OK\n"); - } - - if (crldiff) { - X509_CRL *newcrl, *delta; - if (!keyfile) { - BIO_puts(bio_err, "Missing CRL signing key\n"); - goto end; - } - newcrl = load_crl(crldiff, informat); - if (!newcrl) - goto end; - pkey = load_key(keyfile, keyformat, 0, NULL, NULL, "CRL signing key"); - if (!pkey) { - X509_CRL_free(newcrl); - goto end; - } - delta = X509_CRL_diff(x, newcrl, pkey, digest, 0); - X509_CRL_free(newcrl); - EVP_PKEY_free(pkey); - if (delta) { - X509_CRL_free(x); - x = delta; - } else { - BIO_puts(bio_err, "Error creating delta CRL\n"); - goto end; - } - } - - if (badsig) { - const ASN1_BIT_STRING *sig; - - X509_CRL_get0_signature(x, &sig, NULL); - corrupt_signature(sig); - } - - if (num) { - for (i = 1; i <= num; i++) { - if (issuer == i) { - print_name(bio_out, "issuer=", X509_CRL_get_issuer(x), - get_nameopt()); - } - if (crlnumber == i) { - ASN1_INTEGER *crlnum; - crlnum = X509_CRL_get_ext_d2i(x, NID_crl_number, NULL, NULL); - BIO_printf(bio_out, "crlNumber="); - if (crlnum) { - i2a_ASN1_INTEGER(bio_out, crlnum); - ASN1_INTEGER_free(crlnum); - } else - BIO_puts(bio_out, "<NONE>"); - BIO_printf(bio_out, "\n"); - } - if (hash == i) { - BIO_printf(bio_out, "%08lx\n", - X509_NAME_hash(X509_CRL_get_issuer(x))); - } -#ifndef OPENSSL_NO_MD5 - if (hash_old == i) { - BIO_printf(bio_out, "%08lx\n", - X509_NAME_hash_old(X509_CRL_get_issuer(x))); - } -#endif - if (lastupdate == i) { - BIO_printf(bio_out, "lastUpdate="); - ASN1_TIME_print(bio_out, X509_CRL_get0_lastUpdate(x)); - BIO_printf(bio_out, "\n"); - } - if (nextupdate == i) { - BIO_printf(bio_out, "nextUpdate="); - if (X509_CRL_get0_nextUpdate(x)) - ASN1_TIME_print(bio_out, X509_CRL_get0_nextUpdate(x)); - else - BIO_printf(bio_out, "NONE"); - BIO_printf(bio_out, "\n"); - } - if (fingerprint == i) { - int j; - unsigned int n; - unsigned char md[EVP_MAX_MD_SIZE]; - - if (!X509_CRL_digest(x, digest, md, &n)) { - BIO_printf(bio_err, "out of memory\n"); - goto end; - } - BIO_printf(bio_out, "%s Fingerprint=", - OBJ_nid2sn(EVP_MD_type(digest))); - for (j = 0; j < (int)n; j++) { - BIO_printf(bio_out, "%02X%c", md[j], (j + 1 == (int)n) - ? '\n' : ':'); - } - } - } - } - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if (text) - X509_CRL_print_ex(out, x, get_nameopt()); - - if (noout) { - ret = 0; - goto end; - } - - if (outformat == FORMAT_ASN1) - i = (int)i2d_X509_CRL_bio(out, x); - else - i = PEM_write_bio_X509_CRL(out, x); - if (!i) { - BIO_printf(bio_err, "unable to write CRL\n"); - goto end; - } - ret = 0; - - end: - if (ret != 0) - ERR_print_errors(bio_err); - BIO_free_all(out); - X509_CRL_free(x); - X509_STORE_CTX_free(ctx); - X509_STORE_free(store); - return ret; -} diff --git a/contrib/libs/openssl/apps/crl2p7.c b/contrib/libs/openssl/apps/crl2p7.c deleted file mode 100644 index 3f619bf527..0000000000 --- a/contrib/libs/openssl/apps/crl2p7.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include "apps.h" -#include "progs.h" -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pkcs7.h> -#include <openssl/pem.h> -#include <openssl/objects.h> - -static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_NOCRL, OPT_CERTFILE -} OPTION_CHOICE; - -const OPTIONS crl2pkcs7_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format - DER or PEM"}, - {"outform", OPT_OUTFORM, 'F', "Output format - DER or PEM"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"nocrl", OPT_NOCRL, '-', "No crl to load, just certs from '-certfile'"}, - {"certfile", OPT_CERTFILE, '<', - "File of chain of certs to a trusted CA; can be repeated"}, - {NULL} -}; - -int crl2pkcs7_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - PKCS7 *p7 = NULL; - PKCS7_SIGNED *p7s = NULL; - STACK_OF(OPENSSL_STRING) *certflst = NULL; - STACK_OF(X509) *cert_stack = NULL; - STACK_OF(X509_CRL) *crl_stack = NULL; - X509_CRL *crl = NULL; - char *infile = NULL, *outfile = NULL, *prog, *certfile; - int i = 0, informat = FORMAT_PEM, outformat = FORMAT_PEM, ret = 1, nocrl = - 0; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, crl2pkcs7_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(crl2pkcs7_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_NOCRL: - nocrl = 1; - break; - case OPT_CERTFILE: - if ((certflst == NULL) - && (certflst = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - if (!sk_OPENSSL_STRING_push(certflst, opt_arg())) - goto end; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (!nocrl) { - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - - if (informat == FORMAT_ASN1) - crl = d2i_X509_CRL_bio(in, NULL); - else if (informat == FORMAT_PEM) - crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL); - if (crl == NULL) { - BIO_printf(bio_err, "unable to load CRL\n"); - ERR_print_errors(bio_err); - goto end; - } - } - - if ((p7 = PKCS7_new()) == NULL) - goto end; - if ((p7s = PKCS7_SIGNED_new()) == NULL) - goto end; - p7->type = OBJ_nid2obj(NID_pkcs7_signed); - p7->d.sign = p7s; - p7s->contents->type = OBJ_nid2obj(NID_pkcs7_data); - - if (!ASN1_INTEGER_set(p7s->version, 1)) - goto end; - - if (crl != NULL) { - if ((crl_stack = sk_X509_CRL_new_null()) == NULL) - goto end; - p7s->crl = crl_stack; - sk_X509_CRL_push(crl_stack, crl); - crl = NULL; /* now part of p7 for OPENSSL_freeing */ - } - - if (certflst != NULL) { - if ((cert_stack = sk_X509_new_null()) == NULL) - goto end; - p7s->cert = cert_stack; - - for (i = 0; i < sk_OPENSSL_STRING_num(certflst); i++) { - certfile = sk_OPENSSL_STRING_value(certflst, i); - if (add_certs_from_file(cert_stack, certfile) < 0) { - BIO_printf(bio_err, "error loading certificates\n"); - ERR_print_errors(bio_err); - goto end; - } - } - } - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if (outformat == FORMAT_ASN1) - i = i2d_PKCS7_bio(out, p7); - else if (outformat == FORMAT_PEM) - i = PEM_write_bio_PKCS7(out, p7); - if (!i) { - BIO_printf(bio_err, "unable to write pkcs7 object\n"); - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - end: - sk_OPENSSL_STRING_free(certflst); - BIO_free(in); - BIO_free_all(out); - PKCS7_free(p7); - X509_CRL_free(crl); - - return ret; -} - -/*- - *---------------------------------------------------------------------- - * int add_certs_from_file - * - * Read a list of certificates to be checked from a file. - * - * Results: - * number of certs added if successful, -1 if not. - *---------------------------------------------------------------------- - */ -static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile) -{ - BIO *in = NULL; - int count = 0; - int ret = -1; - STACK_OF(X509_INFO) *sk = NULL; - X509_INFO *xi; - - in = BIO_new_file(certfile, "r"); - if (in == NULL) { - BIO_printf(bio_err, "error opening the file, %s\n", certfile); - goto end; - } - - /* This loads from a file, a stack of x509/crl/pkey sets */ - sk = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL); - if (sk == NULL) { - BIO_printf(bio_err, "error reading the file, %s\n", certfile); - goto end; - } - - /* scan over it and pull out the CRL's */ - while (sk_X509_INFO_num(sk)) { - xi = sk_X509_INFO_shift(sk); - if (xi->x509 != NULL) { - sk_X509_push(stack, xi->x509); - xi->x509 = NULL; - count++; - } - X509_INFO_free(xi); - } - - ret = count; - end: - /* never need to OPENSSL_free x */ - BIO_free(in); - sk_X509_INFO_free(sk); - return ret; -} diff --git a/contrib/libs/openssl/apps/dgst.c b/contrib/libs/openssl/apps/dgst.c deleted file mode 100644 index e595f7d818..0000000000 --- a/contrib/libs/openssl/apps/dgst.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/objects.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/hmac.h> -#include <ctype.h> - -#undef BUFSIZE -#define BUFSIZE 1024*8 - -int do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout, - EVP_PKEY *key, unsigned char *sigin, int siglen, - const char *sig_name, const char *md_name, - const char *file); -static void show_digests(const OBJ_NAME *name, void *bio_); - -struct doall_dgst_digests { - BIO *bio; - int n; -}; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_LIST, - OPT_C, OPT_R, OPT_OUT, OPT_SIGN, OPT_PASSIN, OPT_VERIFY, - OPT_PRVERIFY, OPT_SIGNATURE, OPT_KEYFORM, OPT_ENGINE, OPT_ENGINE_IMPL, - OPT_HEX, OPT_BINARY, OPT_DEBUG, OPT_FIPS_FINGERPRINT, - OPT_HMAC, OPT_MAC, OPT_SIGOPT, OPT_MACOPT, - OPT_DIGEST, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS dgst_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] [file...]\n"}, - {OPT_HELP_STR, 1, '-', - " file... files to digest (default is stdin)\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"list", OPT_LIST, '-', "List digests"}, - {"c", OPT_C, '-', "Print the digest with separating colons"}, - {"r", OPT_R, '-', "Print the digest in coreutils format"}, - {"out", OPT_OUT, '>', "Output to filename rather than stdout"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"sign", OPT_SIGN, 's', "Sign digest using private key"}, - {"verify", OPT_VERIFY, 's', - "Verify a signature using public key"}, - {"prverify", OPT_PRVERIFY, 's', - "Verify a signature using private key"}, - {"signature", OPT_SIGNATURE, '<', "File with signature to verify"}, - {"keyform", OPT_KEYFORM, 'f', "Key file format (PEM or ENGINE)"}, - {"hex", OPT_HEX, '-', "Print as hex dump"}, - {"binary", OPT_BINARY, '-', "Print in binary form"}, - {"d", OPT_DEBUG, '-', "Print debug info"}, - {"debug", OPT_DEBUG, '-', "Print debug info"}, - {"fips-fingerprint", OPT_FIPS_FINGERPRINT, '-', - "Compute HMAC with the key used in OpenSSL-FIPS fingerprint"}, - {"hmac", OPT_HMAC, 's', "Create hashed MAC with key"}, - {"mac", OPT_MAC, 's', "Create MAC (not necessarily HMAC)"}, - {"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"}, - {"macopt", OPT_MACOPT, 's', "MAC algorithm parameters in n:v form or key"}, - {"", OPT_DIGEST, '-', "Any supported digest"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine e, possibly a hardware device"}, - {"engine_impl", OPT_ENGINE_IMPL, '-', - "Also use engine given by -engine for digest operations"}, -#endif - {NULL} -}; - -int dgst_main(int argc, char **argv) -{ - BIO *in = NULL, *inp, *bmd = NULL, *out = NULL; - ENGINE *e = NULL, *impl = NULL; - EVP_PKEY *sigkey = NULL; - STACK_OF(OPENSSL_STRING) *sigopts = NULL, *macopts = NULL; - char *hmac_key = NULL; - char *mac_name = NULL; - char *passinarg = NULL, *passin = NULL; - const EVP_MD *md = NULL, *m; - const char *outfile = NULL, *keyfile = NULL, *prog = NULL; - const char *sigfile = NULL; - OPTION_CHOICE o; - int separator = 0, debug = 0, keyform = FORMAT_PEM, siglen = 0; - int i, ret = 1, out_bin = -1, want_pub = 0, do_verify = 0; - unsigned char *buf = NULL, *sigbuf = NULL; - int engine_impl = 0; - struct doall_dgst_digests dec; - - prog = opt_progname(argv[0]); - buf = app_malloc(BUFSIZE, "I/O buffer"); - md = EVP_get_digestbyname(prog); - - prog = opt_init(argc, argv, dgst_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(dgst_options); - ret = 0; - goto end; - case OPT_LIST: - BIO_printf(bio_out, "Supported digests:\n"); - dec.bio = bio_out; - dec.n = 0; - OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, - show_digests, &dec); - BIO_printf(bio_out, "\n"); - ret = 0; - goto end; - case OPT_C: - separator = 1; - break; - case OPT_R: - separator = 2; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_SIGN: - keyfile = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_VERIFY: - keyfile = opt_arg(); - want_pub = do_verify = 1; - break; - case OPT_PRVERIFY: - keyfile = opt_arg(); - do_verify = 1; - break; - case OPT_SIGNATURE: - sigfile = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyform)) - goto opthelp; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_ENGINE_IMPL: - engine_impl = 1; - break; - case OPT_HEX: - out_bin = 0; - break; - case OPT_BINARY: - out_bin = 1; - break; - case OPT_DEBUG: - debug = 1; - break; - case OPT_FIPS_FINGERPRINT: - hmac_key = "etaonrishdlcupfm"; - break; - case OPT_HMAC: - hmac_key = opt_arg(); - break; - case OPT_MAC: - mac_name = opt_arg(); - break; - case OPT_SIGOPT: - if (!sigopts) - sigopts = sk_OPENSSL_STRING_new_null(); - if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, opt_arg())) - goto opthelp; - break; - case OPT_MACOPT: - if (!macopts) - macopts = sk_OPENSSL_STRING_new_null(); - if (!macopts || !sk_OPENSSL_STRING_push(macopts, opt_arg())) - goto opthelp; - break; - case OPT_DIGEST: - if (!opt_md(opt_unknown(), &m)) - goto opthelp; - md = m; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - if (keyfile != NULL && argc > 1) { - BIO_printf(bio_err, "%s: Can only sign or verify one file.\n", prog); - goto end; - } - - if (do_verify && sigfile == NULL) { - BIO_printf(bio_err, - "No signature to verify: use the -signature option\n"); - goto end; - } - if (engine_impl) - impl = e; - - in = BIO_new(BIO_s_file()); - bmd = BIO_new(BIO_f_md()); - if ((in == NULL) || (bmd == NULL)) { - ERR_print_errors(bio_err); - goto end; - } - - if (debug) { - BIO_set_callback(in, BIO_debug_callback); - /* needed for windows 3.1 */ - BIO_set_callback_arg(in, (char *)bio_err); - } - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - if (out_bin == -1) { - if (keyfile != NULL) - out_bin = 1; - else - out_bin = 0; - } - - out = bio_open_default(outfile, 'w', out_bin ? FORMAT_BINARY : FORMAT_TEXT); - if (out == NULL) - goto end; - - if ((!(mac_name == NULL) + !(keyfile == NULL) + !(hmac_key == NULL)) > 1) { - BIO_printf(bio_err, "MAC and Signing key cannot both be specified\n"); - goto end; - } - - if (keyfile != NULL) { - int type; - - if (want_pub) - sigkey = load_pubkey(keyfile, keyform, 0, NULL, e, "key file"); - else - sigkey = load_key(keyfile, keyform, 0, passin, e, "key file"); - if (sigkey == NULL) { - /* - * load_[pub]key() has already printed an appropriate message - */ - goto end; - } - type = EVP_PKEY_id(sigkey); - if (type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448) { - /* - * We implement PureEdDSA for these which doesn't have a separate - * digest, and only supports one shot. - */ - BIO_printf(bio_err, "Key type not supported for this operation\n"); - goto end; - } - } - - if (mac_name != NULL) { - EVP_PKEY_CTX *mac_ctx = NULL; - int r = 0; - if (!init_gen_str(&mac_ctx, mac_name, impl, 0)) - goto mac_end; - if (macopts != NULL) { - char *macopt; - for (i = 0; i < sk_OPENSSL_STRING_num(macopts); i++) { - macopt = sk_OPENSSL_STRING_value(macopts, i); - if (pkey_ctrl_string(mac_ctx, macopt) <= 0) { - BIO_printf(bio_err, - "MAC parameter error \"%s\"\n", macopt); - ERR_print_errors(bio_err); - goto mac_end; - } - } - } - if (EVP_PKEY_keygen(mac_ctx, &sigkey) <= 0) { - BIO_puts(bio_err, "Error generating key\n"); - ERR_print_errors(bio_err); - goto mac_end; - } - r = 1; - mac_end: - EVP_PKEY_CTX_free(mac_ctx); - if (r == 0) - goto end; - } - - if (hmac_key != NULL) { - sigkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, impl, - (unsigned char *)hmac_key, -1); - if (sigkey == NULL) - goto end; - } - - if (sigkey != NULL) { - EVP_MD_CTX *mctx = NULL; - EVP_PKEY_CTX *pctx = NULL; - int r; - if (!BIO_get_md_ctx(bmd, &mctx)) { - BIO_printf(bio_err, "Error getting context\n"); - ERR_print_errors(bio_err); - goto end; - } - if (do_verify) - r = EVP_DigestVerifyInit(mctx, &pctx, md, impl, sigkey); - else - r = EVP_DigestSignInit(mctx, &pctx, md, impl, sigkey); - if (!r) { - BIO_printf(bio_err, "Error setting context\n"); - ERR_print_errors(bio_err); - goto end; - } - if (sigopts != NULL) { - char *sigopt; - for (i = 0; i < sk_OPENSSL_STRING_num(sigopts); i++) { - sigopt = sk_OPENSSL_STRING_value(sigopts, i); - if (pkey_ctrl_string(pctx, sigopt) <= 0) { - BIO_printf(bio_err, "parameter error \"%s\"\n", sigopt); - ERR_print_errors(bio_err); - goto end; - } - } - } - } - /* we use md as a filter, reading from 'in' */ - else { - EVP_MD_CTX *mctx = NULL; - if (!BIO_get_md_ctx(bmd, &mctx)) { - BIO_printf(bio_err, "Error getting context\n"); - ERR_print_errors(bio_err); - goto end; - } - if (md == NULL) - md = EVP_sha256(); - if (!EVP_DigestInit_ex(mctx, md, impl)) { - BIO_printf(bio_err, "Error setting digest\n"); - ERR_print_errors(bio_err); - goto end; - } - } - - if (sigfile != NULL && sigkey != NULL) { - BIO *sigbio = BIO_new_file(sigfile, "rb"); - if (sigbio == NULL) { - BIO_printf(bio_err, "Error opening signature file %s\n", sigfile); - ERR_print_errors(bio_err); - goto end; - } - siglen = EVP_PKEY_size(sigkey); - sigbuf = app_malloc(siglen, "signature buffer"); - siglen = BIO_read(sigbio, sigbuf, siglen); - BIO_free(sigbio); - if (siglen <= 0) { - BIO_printf(bio_err, "Error reading signature file %s\n", sigfile); - ERR_print_errors(bio_err); - goto end; - } - } - inp = BIO_push(bmd, in); - - if (md == NULL) { - EVP_MD_CTX *tctx; - BIO_get_md_ctx(bmd, &tctx); - md = EVP_MD_CTX_md(tctx); - } - - if (argc == 0) { - BIO_set_fp(in, stdin, BIO_NOCLOSE); - ret = do_fp(out, buf, inp, separator, out_bin, sigkey, sigbuf, - siglen, NULL, NULL, "stdin"); - } else { - const char *md_name = NULL, *sig_name = NULL; - if (!out_bin) { - if (sigkey != NULL) { - const EVP_PKEY_ASN1_METHOD *ameth; - ameth = EVP_PKEY_get0_asn1(sigkey); - if (ameth) - EVP_PKEY_asn1_get0_info(NULL, NULL, - NULL, NULL, &sig_name, ameth); - } - if (md != NULL) - md_name = EVP_MD_name(md); - } - ret = 0; - for (i = 0; i < argc; i++) { - int r; - if (BIO_read_filename(in, argv[i]) <= 0) { - perror(argv[i]); - ret++; - continue; - } else { - r = do_fp(out, buf, inp, separator, out_bin, sigkey, sigbuf, - siglen, sig_name, md_name, argv[i]); - } - if (r) - ret = r; - (void)BIO_reset(bmd); - } - } - end: - OPENSSL_clear_free(buf, BUFSIZE); - BIO_free(in); - OPENSSL_free(passin); - BIO_free_all(out); - EVP_PKEY_free(sigkey); - sk_OPENSSL_STRING_free(sigopts); - sk_OPENSSL_STRING_free(macopts); - OPENSSL_free(sigbuf); - BIO_free(bmd); - release_engine(e); - return ret; -} - -static void show_digests(const OBJ_NAME *name, void *arg) -{ - struct doall_dgst_digests *dec = (struct doall_dgst_digests *)arg; - const EVP_MD *md = NULL; - - /* Filter out signed digests (a.k.a signature algorithms) */ - if (strstr(name->name, "rsa") != NULL || strstr(name->name, "RSA") != NULL) - return; - - if (!islower((unsigned char)*name->name)) - return; - - /* Filter out message digests that we cannot use */ - md = EVP_get_digestbyname(name->name); - if (md == NULL) - return; - - BIO_printf(dec->bio, "-%-25s", name->name); - if (++dec->n == 3) { - BIO_printf(dec->bio, "\n"); - dec->n = 0; - } else { - BIO_printf(dec->bio, " "); - } -} - -/* - * The newline_escape_filename function performs newline escaping for any - * filename that contains a newline. This function also takes a pointer - * to backslash. The backslash pointer is a flag to indicating whether a newline - * is present in the filename. If a newline is present, the backslash flag is - * set and the output format will contain a backslash at the beginning of the - * digest output. This output format is to replicate the output format found - * in the '*sum' checksum programs. This aims to preserve backward - * compatibility. - */ -static const char *newline_escape_filename(const char *file, int * backslash) -{ - size_t i, e = 0, length = strlen(file), newline_count = 0, mem_len = 0; - char *file_cpy = NULL; - - for (i = 0; i < length; i++) - if (file[i] == '\n') - newline_count++; - - mem_len = length + newline_count + 1; - file_cpy = app_malloc(mem_len, file); - i = 0; - - while(e < length) { - const char c = file[e]; - if (c == '\n') { - file_cpy[i++] = '\\'; - file_cpy[i++] = 'n'; - *backslash = 1; - } else { - file_cpy[i++] = c; - } - e++; - } - file_cpy[i] = '\0'; - return (const char*)file_cpy; -} - - -int do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout, - EVP_PKEY *key, unsigned char *sigin, int siglen, - const char *sig_name, const char *md_name, - const char *file) -{ - size_t len = BUFSIZE; - int i, backslash = 0, ret = 1; - unsigned char *sigbuf = NULL; - - while (BIO_pending(bp) || !BIO_eof(bp)) { - i = BIO_read(bp, (char *)buf, BUFSIZE); - if (i < 0) { - BIO_printf(bio_err, "Read Error in %s\n", file); - ERR_print_errors(bio_err); - goto end; - } - if (i == 0) - break; - } - if (sigin != NULL) { - EVP_MD_CTX *ctx; - BIO_get_md_ctx(bp, &ctx); - i = EVP_DigestVerifyFinal(ctx, sigin, (unsigned int)siglen); - if (i > 0) { - BIO_printf(out, "Verified OK\n"); - } else if (i == 0) { - BIO_printf(out, "Verification Failure\n"); - goto end; - } else { - BIO_printf(bio_err, "Error Verifying Data\n"); - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - goto end; - } - if (key != NULL) { - EVP_MD_CTX *ctx; - int pkey_len; - BIO_get_md_ctx(bp, &ctx); - pkey_len = EVP_PKEY_size(key); - if (pkey_len > BUFSIZE) { - len = pkey_len; - sigbuf = app_malloc(len, "Signature buffer"); - buf = sigbuf; - } - if (!EVP_DigestSignFinal(ctx, buf, &len)) { - BIO_printf(bio_err, "Error Signing Data\n"); - ERR_print_errors(bio_err); - goto end; - } - } else { - len = BIO_gets(bp, (char *)buf, BUFSIZE); - if ((int)len < 0) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (binout) { - BIO_write(out, buf, len); - } else if (sep == 2) { - file = newline_escape_filename(file, &backslash); - - if (backslash == 1) - BIO_puts(out, "\\"); - - for (i = 0; i < (int)len; i++) - BIO_printf(out, "%02x", buf[i]); - - BIO_printf(out, " *%s\n", file); - OPENSSL_free((char *)file); - } else { - if (sig_name != NULL) { - BIO_puts(out, sig_name); - if (md_name != NULL) - BIO_printf(out, "-%s", md_name); - BIO_printf(out, "(%s)= ", file); - } else if (md_name != NULL) { - BIO_printf(out, "%s(%s)= ", md_name, file); - } else { - BIO_printf(out, "(%s)= ", file); - } - for (i = 0; i < (int)len; i++) { - if (sep && (i != 0)) - BIO_printf(out, ":"); - BIO_printf(out, "%02x", buf[i]); - } - BIO_printf(out, "\n"); - } - - ret = 0; - end: - if (sigbuf != NULL) - OPENSSL_clear_free(sigbuf, len); - - return ret; -} diff --git a/contrib/libs/openssl/apps/dhparam.c b/contrib/libs/openssl/apps/dhparam.c deleted file mode 100644 index 98c73214b5..0000000000 --- a/contrib/libs/openssl/apps/dhparam.c +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/dh.h> -#include <openssl/x509.h> -#include <openssl/pem.h> - -#ifndef OPENSSL_NO_DSA -# include <openssl/dsa.h> -#endif - -#define DEFBITS 2048 - -static int dh_cb(int p, int n, BN_GENCB *cb); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, - OPT_ENGINE, OPT_CHECK, OPT_TEXT, OPT_NOOUT, - OPT_DSAPARAM, OPT_C, OPT_2, OPT_5, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS dhparam_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [flags] [numbits]\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, '<', "Input file"}, - {"inform", OPT_INFORM, 'F', "Input format, DER or PEM"}, - {"outform", OPT_OUTFORM, 'F', "Output format, DER or PEM"}, - {"out", OPT_OUT, '>', "Output file"}, - {"check", OPT_CHECK, '-', "Check the DH parameters"}, - {"text", OPT_TEXT, '-', "Print a text form of the DH parameters"}, - {"noout", OPT_NOOUT, '-', "Don't output any DH parameters"}, - OPT_R_OPTIONS, - {"C", OPT_C, '-', "Print C code"}, - {"2", OPT_2, '-', "Generate parameters using 2 as the generator value"}, - {"5", OPT_5, '-', "Generate parameters using 5 as the generator value"}, -#ifndef OPENSSL_NO_DSA - {"dsaparam", OPT_DSAPARAM, '-', - "Read or generate DSA parameters, convert to DH"}, -#endif -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine e, possibly a hardware device"}, -#endif - {NULL} -}; - -int dhparam_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - DH *dh = NULL; - char *infile = NULL, *outfile = NULL, *prog; - ENGINE *e = NULL; -#ifndef OPENSSL_NO_DSA - int dsaparam = 0; -#endif - int i, text = 0, C = 0, ret = 1, num = 0, g = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, check = 0, noout = 0; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, dhparam_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(dhparam_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_CHECK: - check = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_DSAPARAM: -#ifndef OPENSSL_NO_DSA - dsaparam = 1; -#endif - break; - case OPT_C: - C = 1; - break; - case OPT_2: - g = 2; - break; - case OPT_5: - g = 5; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (argv[0] != NULL && (!opt_int(argv[0], &num) || num <= 0)) - goto end; - - if (g && !num) - num = DEFBITS; - -#ifndef OPENSSL_NO_DSA - if (dsaparam && g) { - BIO_printf(bio_err, - "generator may not be chosen for DSA parameters\n"); - goto end; - } -#endif - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - /* DH parameters */ - if (num && !g) - g = 2; - - if (num) { - - BN_GENCB *cb; - cb = BN_GENCB_new(); - if (cb == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - BN_GENCB_set(cb, dh_cb, bio_err); - -#ifndef OPENSSL_NO_DSA - if (dsaparam) { - DSA *dsa = DSA_new(); - - BIO_printf(bio_err, - "Generating DSA parameters, %d bit long prime\n", num); - if (dsa == NULL - || !DSA_generate_parameters_ex(dsa, num, NULL, 0, NULL, NULL, - cb)) { - DSA_free(dsa); - BN_GENCB_free(cb); - ERR_print_errors(bio_err); - goto end; - } - - dh = DSA_dup_DH(dsa); - DSA_free(dsa); - if (dh == NULL) { - BN_GENCB_free(cb); - ERR_print_errors(bio_err); - goto end; - } - } else -#endif - { - dh = DH_new(); - BIO_printf(bio_err, - "Generating DH parameters, %d bit long safe prime, generator %d\n", - num, g); - BIO_printf(bio_err, "This is going to take a long time\n"); - if (dh == NULL || !DH_generate_parameters_ex(dh, num, g, cb)) { - BN_GENCB_free(cb); - ERR_print_errors(bio_err); - goto end; - } - } - - BN_GENCB_free(cb); - } else { - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - -#ifndef OPENSSL_NO_DSA - if (dsaparam) { - DSA *dsa; - - if (informat == FORMAT_ASN1) - dsa = d2i_DSAparams_bio(in, NULL); - else /* informat == FORMAT_PEM */ - dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL); - - if (dsa == NULL) { - BIO_printf(bio_err, "unable to load DSA parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - - dh = DSA_dup_DH(dsa); - DSA_free(dsa); - if (dh == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } else -#endif - { - if (informat == FORMAT_ASN1) { - /* - * We have no PEM header to determine what type of DH params it - * is. We'll just try both. - */ - dh = d2i_DHparams_bio(in, NULL); - /* BIO_reset() returns 0 for success for file BIOs only!!! */ - if (dh == NULL && BIO_reset(in) == 0) - dh = d2i_DHxparams_bio(in, NULL); - } else { - /* informat == FORMAT_PEM */ - dh = PEM_read_bio_DHparams(in, NULL, NULL, NULL); - } - - if (dh == NULL) { - BIO_printf(bio_err, "unable to load DH parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - } - - /* dh != NULL */ - } - - if (text) { - DHparams_print(out, dh); - } - - if (check) { - if (!DH_check(dh, &i)) { - ERR_print_errors(bio_err); - goto end; - } - if (i & DH_CHECK_P_NOT_PRIME) - BIO_printf(bio_err, "WARNING: p value is not prime\n"); - if (i & DH_CHECK_P_NOT_SAFE_PRIME) - BIO_printf(bio_err, "WARNING: p value is not a safe prime\n"); - if (i & DH_CHECK_Q_NOT_PRIME) - BIO_printf(bio_err, "WARNING: q value is not a prime\n"); - if (i & DH_CHECK_INVALID_Q_VALUE) - BIO_printf(bio_err, "WARNING: q value is invalid\n"); - if (i & DH_CHECK_INVALID_J_VALUE) - BIO_printf(bio_err, "WARNING: j value is invalid\n"); - if (i & DH_UNABLE_TO_CHECK_GENERATOR) - BIO_printf(bio_err, - "WARNING: unable to check the generator value\n"); - if (i & DH_NOT_SUITABLE_GENERATOR) - BIO_printf(bio_err, "WARNING: the g value is not a generator\n"); - if (i == 0) - BIO_printf(bio_err, "DH parameters appear to be ok.\n"); - if (num != 0 && i != 0) { - /* - * We have generated parameters but DH_check() indicates they are - * invalid! This should never happen! - */ - BIO_printf(bio_err, "ERROR: Invalid parameters generated\n"); - goto end; - } - } - if (C) { - unsigned char *data; - int len, bits; - const BIGNUM *pbn, *gbn; - - len = DH_size(dh); - bits = DH_bits(dh); - DH_get0_pqg(dh, &pbn, NULL, &gbn); - data = app_malloc(len, "print a BN"); - - BIO_printf(out, "static DH *get_dh%d(void)\n{\n", bits); - print_bignum_var(out, pbn, "dhp", bits, data); - print_bignum_var(out, gbn, "dhg", bits, data); - BIO_printf(out, " DH *dh = DH_new();\n" - " BIGNUM *p, *g;\n" - "\n" - " if (dh == NULL)\n" - " return NULL;\n"); - BIO_printf(out, " p = BN_bin2bn(dhp_%d, sizeof(dhp_%d), NULL);\n", - bits, bits); - BIO_printf(out, " g = BN_bin2bn(dhg_%d, sizeof(dhg_%d), NULL);\n", - bits, bits); - BIO_printf(out, " if (p == NULL || g == NULL\n" - " || !DH_set0_pqg(dh, p, NULL, g)) {\n" - " DH_free(dh);\n" - " BN_free(p);\n" - " BN_free(g);\n" - " return NULL;\n" - " }\n"); - if (DH_get_length(dh) > 0) - BIO_printf(out, - " if (!DH_set_length(dh, %ld)) {\n" - " DH_free(dh);\n" - " return NULL;\n" - " }\n", DH_get_length(dh)); - BIO_printf(out, " return dh;\n}\n"); - OPENSSL_free(data); - } - - if (!noout) { - const BIGNUM *q; - DH_get0_pqg(dh, NULL, &q, NULL); - if (outformat == FORMAT_ASN1) { - if (q != NULL) - i = i2d_DHxparams_bio(out, dh); - else - i = i2d_DHparams_bio(out, dh); - } else if (q != NULL) { - i = PEM_write_bio_DHxparams(out, dh); - } else { - i = PEM_write_bio_DHparams(out, dh); - } - if (!i) { - BIO_printf(bio_err, "unable to write DH parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - } - ret = 0; - end: - BIO_free(in); - BIO_free_all(out); - DH_free(dh); - release_engine(e); - return ret; -} - -static int dh_cb(int p, int n, BN_GENCB *cb) -{ - static const char symbols[] = ".+*\n"; - char c = (p >= 0 && (size_t)p < sizeof(symbols) - 1) ? symbols[p] : '?'; - - BIO_write(BN_GENCB_get_arg(cb), &c, 1); - (void)BIO_flush(BN_GENCB_get_arg(cb)); - return 1; -} diff --git a/contrib/libs/openssl/apps/dsa.c b/contrib/libs/openssl/apps/dsa.c deleted file mode 100644 index c7884df166..0000000000 --- a/contrib/libs/openssl/apps/dsa.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/dsa.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/bn.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_ENGINE, - /* Do not change the order here; see case statements below */ - OPT_PVK_NONE, OPT_PVK_WEAK, OPT_PVK_STRONG, - OPT_NOOUT, OPT_TEXT, OPT_MODULUS, OPT_PUBIN, - OPT_PUBOUT, OPT_CIPHER, OPT_PASSIN, OPT_PASSOUT -} OPTION_CHOICE; - -const OPTIONS dsa_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'f', "Input format, DER PEM PVK"}, - {"outform", OPT_OUTFORM, 'f', "Output format, DER PEM PVK"}, - {"in", OPT_IN, 's', "Input key"}, - {"out", OPT_OUT, '>', "Output file"}, - {"noout", OPT_NOOUT, '-', "Don't print key out"}, - {"text", OPT_TEXT, '-', "Print the key in text"}, - {"modulus", OPT_MODULUS, '-', "Print the DSA public value"}, - {"pubin", OPT_PUBIN, '-', "Expect a public key in input file"}, - {"pubout", OPT_PUBOUT, '-', "Output public key, not private"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, -#ifndef OPENSSL_NO_RC4 - {"pvk-strong", OPT_PVK_STRONG, '-', "Enable 'Strong' PVK encoding level (default)"}, - {"pvk-weak", OPT_PVK_WEAK, '-', "Enable 'Weak' PVK encoding level"}, - {"pvk-none", OPT_PVK_NONE, '-', "Don't enforce PVK encoding"}, -#endif -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine e, possibly a hardware device"}, -#endif - {NULL} -}; - -int dsa_main(int argc, char **argv) -{ - BIO *out = NULL; - DSA *dsa = NULL; - ENGINE *e = NULL; - const EVP_CIPHER *enc = NULL; - char *infile = NULL, *outfile = NULL, *prog; - char *passin = NULL, *passout = NULL, *passinarg = NULL, *passoutarg = NULL; - OPTION_CHOICE o; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, text = 0, noout = 0; - int i, modulus = 0, pubin = 0, pubout = 0, ret = 1; -#ifndef OPENSSL_NO_RC4 - int pvk_encr = 2; -#endif - int private = 0; - - prog = opt_init(argc, argv, dsa_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - ret = 0; - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(dsa_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_PVK_STRONG: /* pvk_encr:= 2 */ - case OPT_PVK_WEAK: /* pvk_encr:= 1 */ - case OPT_PVK_NONE: /* pvk_encr:= 0 */ -#ifndef OPENSSL_NO_RC4 - pvk_encr = (o - OPT_PVK_NONE); -#endif - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_MODULUS: - modulus = 1; - break; - case OPT_PUBIN: - pubin = 1; - break; - case OPT_PUBOUT: - pubout = 1; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &enc)) - goto end; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = pubin || pubout ? 0 : 1; - if (text && !pubin) - private = 1; - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - BIO_printf(bio_err, "read DSA key\n"); - { - EVP_PKEY *pkey; - - if (pubin) - pkey = load_pubkey(infile, informat, 1, passin, e, "Public Key"); - else - pkey = load_key(infile, informat, 1, passin, e, "Private Key"); - - if (pkey != NULL) { - dsa = EVP_PKEY_get1_DSA(pkey); - EVP_PKEY_free(pkey); - } - } - if (dsa == NULL) { - BIO_printf(bio_err, "unable to load Key\n"); - ERR_print_errors(bio_err); - goto end; - } - - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - if (text) { - assert(pubin || private); - if (!DSA_print(out, dsa, 0)) { - perror(outfile); - ERR_print_errors(bio_err); - goto end; - } - } - - if (modulus) { - const BIGNUM *pub_key = NULL; - DSA_get0_key(dsa, &pub_key, NULL); - BIO_printf(out, "Public Key="); - BN_print(out, pub_key); - BIO_printf(out, "\n"); - } - - if (noout) { - ret = 0; - goto end; - } - BIO_printf(bio_err, "writing DSA key\n"); - if (outformat == FORMAT_ASN1) { - if (pubin || pubout) { - i = i2d_DSA_PUBKEY_bio(out, dsa); - } else { - assert(private); - i = i2d_DSAPrivateKey_bio(out, dsa); - } - } else if (outformat == FORMAT_PEM) { - if (pubin || pubout) { - i = PEM_write_bio_DSA_PUBKEY(out, dsa); - } else { - assert(private); - i = PEM_write_bio_DSAPrivateKey(out, dsa, enc, - NULL, 0, NULL, passout); - } -#ifndef OPENSSL_NO_RSA - } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { - EVP_PKEY *pk; - pk = EVP_PKEY_new(); - if (pk == NULL) - goto end; - - EVP_PKEY_set1_DSA(pk, dsa); - if (outformat == FORMAT_PVK) { - if (pubin) { - BIO_printf(bio_err, "PVK form impossible with public key input\n"); - EVP_PKEY_free(pk); - goto end; - } - assert(private); -# ifdef OPENSSL_NO_RC4 - BIO_printf(bio_err, "PVK format not supported\n"); - EVP_PKEY_free(pk); - goto end; -# else - i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout); -# endif - } else if (pubin || pubout) { - i = i2b_PublicKey_bio(out, pk); - } else { - assert(private); - i = i2b_PrivateKey_bio(out, pk); - } - EVP_PKEY_free(pk); -#endif - } else { - BIO_printf(bio_err, "bad output format specified for outfile\n"); - goto end; - } - if (i <= 0) { - BIO_printf(bio_err, "unable to write private key\n"); - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - end: - BIO_free_all(out); - DSA_free(dsa); - release_engine(e); - OPENSSL_free(passin); - OPENSSL_free(passout); - return ret; -} diff --git a/contrib/libs/openssl/apps/dsaparam.c b/contrib/libs/openssl/apps/dsaparam.c deleted file mode 100644 index 75589ac6bc..0000000000 --- a/contrib/libs/openssl/apps/dsaparam.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/dsa.h> -#include <openssl/x509.h> -#include <openssl/pem.h> - -static int dsa_cb(int p, int n, BN_GENCB *cb); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_TEXT, OPT_C, - OPT_NOOUT, OPT_GENKEY, OPT_ENGINE, OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS dsaparam_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format - DER or PEM"}, - {"in", OPT_IN, '<', "Input file"}, - {"outform", OPT_OUTFORM, 'F', "Output format - DER or PEM"}, - {"out", OPT_OUT, '>', "Output file"}, - {"text", OPT_TEXT, '-', "Print as text"}, - {"C", OPT_C, '-', "Output C code"}, - {"noout", OPT_NOOUT, '-', "No output"}, - {"genkey", OPT_GENKEY, '-', "Generate a DSA key"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine e, possibly a hardware device"}, -#endif - {NULL} -}; - -int dsaparam_main(int argc, char **argv) -{ - ENGINE *e = NULL; - DSA *dsa = NULL; - BIO *in = NULL, *out = NULL; - BN_GENCB *cb = NULL; - int numbits = -1, num = 0, genkey = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, noout = 0, C = 0; - int ret = 1, i, text = 0, private = 0; - char *infile = NULL, *outfile = NULL, *prog; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, dsaparam_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(dsaparam_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_TEXT: - text = 1; - break; - case OPT_C: - C = 1; - break; - case OPT_GENKEY: - genkey = 1; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_NOOUT: - noout = 1; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (argc == 1) { - if (!opt_int(argv[0], &num) || num < 0) - goto end; - /* generate a key */ - numbits = num; - } - private = genkey ? 1 : 0; - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - if (numbits > 0) { - if (numbits > OPENSSL_DSA_MAX_MODULUS_BITS) - BIO_printf(bio_err, - "Warning: It is not recommended to use more than %d bit for DSA keys.\n" - " Your key size is %d! Larger key size may behave not as expected.\n", - OPENSSL_DSA_MAX_MODULUS_BITS, numbits); - - cb = BN_GENCB_new(); - if (cb == NULL) { - BIO_printf(bio_err, "Error allocating BN_GENCB object\n"); - goto end; - } - BN_GENCB_set(cb, dsa_cb, bio_err); - dsa = DSA_new(); - if (dsa == NULL) { - BIO_printf(bio_err, "Error allocating DSA object\n"); - goto end; - } - BIO_printf(bio_err, "Generating DSA parameters, %d bit long prime\n", - num); - BIO_printf(bio_err, "This could take some time\n"); - if (!DSA_generate_parameters_ex(dsa, num, NULL, 0, NULL, NULL, cb)) { - ERR_print_errors(bio_err); - BIO_printf(bio_err, "Error, DSA key generation failed\n"); - goto end; - } - } else if (informat == FORMAT_ASN1) { - dsa = d2i_DSAparams_bio(in, NULL); - } else { - dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL); - } - if (dsa == NULL) { - BIO_printf(bio_err, "unable to load DSA parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - - if (text) { - DSAparams_print(out, dsa); - } - - if (C) { - const BIGNUM *p = NULL, *q = NULL, *g = NULL; - unsigned char *data; - int len, bits_p; - - DSA_get0_pqg(dsa, &p, &q, &g); - len = BN_num_bytes(p); - bits_p = BN_num_bits(p); - - data = app_malloc(len + 20, "BN space"); - - BIO_printf(bio_out, "static DSA *get_dsa%d(void)\n{\n", bits_p); - print_bignum_var(bio_out, p, "dsap", bits_p, data); - print_bignum_var(bio_out, q, "dsaq", bits_p, data); - print_bignum_var(bio_out, g, "dsag", bits_p, data); - BIO_printf(bio_out, " DSA *dsa = DSA_new();\n" - " BIGNUM *p, *q, *g;\n" - "\n"); - BIO_printf(bio_out, " if (dsa == NULL)\n" - " return NULL;\n"); - BIO_printf(bio_out, " if (!DSA_set0_pqg(dsa, p = BN_bin2bn(dsap_%d, sizeof(dsap_%d), NULL),\n", - bits_p, bits_p); - BIO_printf(bio_out, " q = BN_bin2bn(dsaq_%d, sizeof(dsaq_%d), NULL),\n", - bits_p, bits_p); - BIO_printf(bio_out, " g = BN_bin2bn(dsag_%d, sizeof(dsag_%d), NULL))) {\n", - bits_p, bits_p); - BIO_printf(bio_out, " DSA_free(dsa);\n" - " BN_free(p);\n" - " BN_free(q);\n" - " BN_free(g);\n" - " return NULL;\n" - " }\n" - " return dsa;\n}\n"); - OPENSSL_free(data); - } - - if (outformat == FORMAT_ASN1 && genkey) - noout = 1; - - if (!noout) { - if (outformat == FORMAT_ASN1) - i = i2d_DSAparams_bio(out, dsa); - else - i = PEM_write_bio_DSAparams(out, dsa); - if (!i) { - BIO_printf(bio_err, "unable to write DSA parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - } - if (genkey) { - DSA *dsakey; - - if ((dsakey = DSAparams_dup(dsa)) == NULL) - goto end; - if (!DSA_generate_key(dsakey)) { - ERR_print_errors(bio_err); - DSA_free(dsakey); - goto end; - } - assert(private); - if (outformat == FORMAT_ASN1) - i = i2d_DSAPrivateKey_bio(out, dsakey); - else - i = PEM_write_bio_DSAPrivateKey(out, dsakey, NULL, NULL, 0, NULL, - NULL); - DSA_free(dsakey); - } - ret = 0; - end: - BN_GENCB_free(cb); - BIO_free(in); - BIO_free_all(out); - DSA_free(dsa); - release_engine(e); - return ret; -} - -static int dsa_cb(int p, int n, BN_GENCB *cb) -{ - static const char symbols[] = ".+*\n"; - char c = (p >= 0 && (size_t)p < sizeof(symbols) - 1) ? symbols[p] : '?'; - - BIO_write(BN_GENCB_get_arg(cb), &c, 1); - (void)BIO_flush(BN_GENCB_get_arg(cb)); - return 1; -} diff --git a/contrib/libs/openssl/apps/ec.c b/contrib/libs/openssl/apps/ec.c deleted file mode 100644 index 0c8ed750cc..0000000000 --- a/contrib/libs/openssl/apps/ec.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/pem.h> - -static OPT_PAIR conv_forms[] = { - {"compressed", POINT_CONVERSION_COMPRESSED}, - {"uncompressed", POINT_CONVERSION_UNCOMPRESSED}, - {"hybrid", POINT_CONVERSION_HYBRID}, - {NULL} -}; - -static OPT_PAIR param_enc[] = { - {"named_curve", OPENSSL_EC_NAMED_CURVE}, - {"explicit", 0}, - {NULL} -}; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_ENGINE, OPT_IN, OPT_OUT, - OPT_NOOUT, OPT_TEXT, OPT_PARAM_OUT, OPT_PUBIN, OPT_PUBOUT, - OPT_PASSIN, OPT_PASSOUT, OPT_PARAM_ENC, OPT_CONV_FORM, OPT_CIPHER, - OPT_NO_PUBLIC, OPT_CHECK -} OPTION_CHOICE; - -const OPTIONS ec_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, 's', "Input file"}, - {"inform", OPT_INFORM, 'f', "Input format - DER or PEM"}, - {"out", OPT_OUT, '>', "Output file"}, - {"outform", OPT_OUTFORM, 'F', "Output format - DER or PEM"}, - {"noout", OPT_NOOUT, '-', "Don't print key out"}, - {"text", OPT_TEXT, '-', "Print the key"}, - {"param_out", OPT_PARAM_OUT, '-', "Print the elliptic curve parameters"}, - {"pubin", OPT_PUBIN, '-', "Expect a public key in input file"}, - {"pubout", OPT_PUBOUT, '-', "Output public key, not private"}, - {"no_public", OPT_NO_PUBLIC, '-', "exclude public key from private key"}, - {"check", OPT_CHECK, '-', "check key consistency"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"param_enc", OPT_PARAM_ENC, 's', - "Specifies the way the ec parameters are encoded"}, - {"conv_form", OPT_CONV_FORM, 's', "Specifies the point conversion form "}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int ec_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL; - EC_KEY *eckey = NULL; - const EC_GROUP *group; - const EVP_CIPHER *enc = NULL; - point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; - char *infile = NULL, *outfile = NULL, *prog; - char *passin = NULL, *passout = NULL, *passinarg = NULL, *passoutarg = NULL; - OPTION_CHOICE o; - int asn1_flag = OPENSSL_EC_NAMED_CURVE, new_form = 0, new_asn1_flag = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, text = 0, noout = 0; - int pubin = 0, pubout = 0, param_out = 0, i, ret = 1, private = 0; - int no_public = 0, check = 0; - - prog = opt_init(argc, argv, ec_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(ec_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_PARAM_OUT: - param_out = 1; - break; - case OPT_PUBIN: - pubin = 1; - break; - case OPT_PUBOUT: - pubout = 1; - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &enc)) - goto opthelp; - break; - case OPT_CONV_FORM: - if (!opt_pair(opt_arg(), conv_forms, &i)) - goto opthelp; - new_form = 1; - form = i; - break; - case OPT_PARAM_ENC: - if (!opt_pair(opt_arg(), param_enc, &i)) - goto opthelp; - new_asn1_flag = 1; - asn1_flag = i; - break; - case OPT_NO_PUBLIC: - no_public = 1; - break; - case OPT_CHECK: - check = 1; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = param_out || pubin || pubout ? 0 : 1; - if (text && !pubin) - private = 1; - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - if (informat != FORMAT_ENGINE) { - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - } - - BIO_printf(bio_err, "read EC key\n"); - if (informat == FORMAT_ASN1) { - if (pubin) - eckey = d2i_EC_PUBKEY_bio(in, NULL); - else - eckey = d2i_ECPrivateKey_bio(in, NULL); - } else if (informat == FORMAT_ENGINE) { - EVP_PKEY *pkey; - if (pubin) - pkey = load_pubkey(infile, informat, 1, passin, e, "Public Key"); - else - pkey = load_key(infile, informat, 1, passin, e, "Private Key"); - if (pkey != NULL) { - eckey = EVP_PKEY_get1_EC_KEY(pkey); - EVP_PKEY_free(pkey); - } - } else { - if (pubin) - eckey = PEM_read_bio_EC_PUBKEY(in, NULL, NULL, NULL); - else - eckey = PEM_read_bio_ECPrivateKey(in, NULL, NULL, passin); - } - if (eckey == NULL) { - BIO_printf(bio_err, "unable to load Key\n"); - ERR_print_errors(bio_err); - goto end; - } - - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - group = EC_KEY_get0_group(eckey); - - if (new_form) - EC_KEY_set_conv_form(eckey, form); - - if (new_asn1_flag) - EC_KEY_set_asn1_flag(eckey, asn1_flag); - - if (no_public) - EC_KEY_set_enc_flags(eckey, EC_PKEY_NO_PUBKEY); - - if (text) { - assert(pubin || private); - if (!EC_KEY_print(out, eckey, 0)) { - perror(outfile); - ERR_print_errors(bio_err); - goto end; - } - } - - if (check) { - if (EC_KEY_check_key(eckey) == 1) { - BIO_printf(bio_err, "EC Key valid.\n"); - } else { - BIO_printf(bio_err, "EC Key Invalid!\n"); - ERR_print_errors(bio_err); - } - } - - if (noout) { - ret = 0; - goto end; - } - - BIO_printf(bio_err, "writing EC key\n"); - if (outformat == FORMAT_ASN1) { - if (param_out) { - i = i2d_ECPKParameters_bio(out, group); - } else if (pubin || pubout) { - i = i2d_EC_PUBKEY_bio(out, eckey); - } else { - assert(private); - i = i2d_ECPrivateKey_bio(out, eckey); - } - } else { - if (param_out) { - i = PEM_write_bio_ECPKParameters(out, group); - } else if (pubin || pubout) { - i = PEM_write_bio_EC_PUBKEY(out, eckey); - } else { - assert(private); - i = PEM_write_bio_ECPrivateKey(out, eckey, enc, - NULL, 0, NULL, passout); - } - } - - if (!i) { - BIO_printf(bio_err, "unable to write private key\n"); - ERR_print_errors(bio_err); - } else { - ret = 0; - } - end: - BIO_free(in); - BIO_free_all(out); - EC_KEY_free(eckey); - release_engine(e); - OPENSSL_free(passin); - OPENSSL_free(passout); - return ret; -} diff --git a/contrib/libs/openssl/apps/ecparam.c b/contrib/libs/openssl/apps/ecparam.c deleted file mode 100644 index 58fbeb95c9..0000000000 --- a/contrib/libs/openssl/apps/ecparam.c +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/ec.h> -#include <openssl/x509.h> -#include <openssl/pem.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_TEXT, OPT_C, - OPT_CHECK, OPT_LIST_CURVES, OPT_NO_SEED, OPT_NOOUT, OPT_NAME, - OPT_CONV_FORM, OPT_PARAM_ENC, OPT_GENKEY, OPT_ENGINE, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS ecparam_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format - default PEM (DER or PEM)"}, - {"outform", OPT_OUTFORM, 'F', "Output format - default PEM"}, - {"in", OPT_IN, '<', "Input file - default stdin"}, - {"out", OPT_OUT, '>', "Output file - default stdout"}, - {"text", OPT_TEXT, '-', "Print the ec parameters in text form"}, - {"C", OPT_C, '-', "Print a 'C' function creating the parameters"}, - {"check", OPT_CHECK, '-', "Validate the ec parameters"}, - {"list_curves", OPT_LIST_CURVES, '-', - "Prints a list of all curve 'short names'"}, - {"no_seed", OPT_NO_SEED, '-', - "If 'explicit' parameters are chosen do not use the seed"}, - {"noout", OPT_NOOUT, '-', "Do not print the ec parameter"}, - {"name", OPT_NAME, 's', - "Use the ec parameters with specified 'short name'"}, - {"conv_form", OPT_CONV_FORM, 's', "Specifies the point conversion form "}, - {"param_enc", OPT_PARAM_ENC, 's', - "Specifies the way the ec parameters are encoded"}, - {"genkey", OPT_GENKEY, '-', "Generate ec key"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -static OPT_PAIR forms[] = { - {"compressed", POINT_CONVERSION_COMPRESSED}, - {"uncompressed", POINT_CONVERSION_UNCOMPRESSED}, - {"hybrid", POINT_CONVERSION_HYBRID}, - {NULL} -}; - -static OPT_PAIR encodings[] = { - {"named_curve", OPENSSL_EC_NAMED_CURVE}, - {"explicit", 0}, - {NULL} -}; - -int ecparam_main(int argc, char **argv) -{ - ENGINE *e = NULL; - BIGNUM *ec_gen = NULL, *ec_order = NULL, *ec_cofactor = NULL; - BIGNUM *ec_p = NULL, *ec_a = NULL, *ec_b = NULL; - BIO *in = NULL, *out = NULL; - EC_GROUP *group = NULL; - point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; - char *curve_name = NULL; - char *infile = NULL, *outfile = NULL, *prog; - unsigned char *buffer = NULL; - OPTION_CHOICE o; - int asn1_flag = OPENSSL_EC_NAMED_CURVE, new_asn1_flag = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, noout = 0, C = 0; - int ret = 1, private = 0; - int list_curves = 0, no_seed = 0, check = 0, new_form = 0; - int text = 0, i, genkey = 0; - - prog = opt_init(argc, argv, ecparam_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(ecparam_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_TEXT: - text = 1; - break; - case OPT_C: - C = 1; - break; - case OPT_CHECK: - check = 1; - break; - case OPT_LIST_CURVES: - list_curves = 1; - break; - case OPT_NO_SEED: - no_seed = 1; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_NAME: - curve_name = opt_arg(); - break; - case OPT_CONV_FORM: - if (!opt_pair(opt_arg(), forms, &new_form)) - goto opthelp; - form = new_form; - new_form = 1; - break; - case OPT_PARAM_ENC: - if (!opt_pair(opt_arg(), encodings, &asn1_flag)) - goto opthelp; - new_asn1_flag = 1; - break; - case OPT_GENKEY: - genkey = 1; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = genkey ? 1 : 0; - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - if (list_curves) { - EC_builtin_curve *curves = NULL; - size_t crv_len = EC_get_builtin_curves(NULL, 0); - size_t n; - - curves = app_malloc((int)sizeof(*curves) * crv_len, "list curves"); - if (!EC_get_builtin_curves(curves, crv_len)) { - OPENSSL_free(curves); - goto end; - } - - for (n = 0; n < crv_len; n++) { - const char *comment; - const char *sname; - comment = curves[n].comment; - sname = OBJ_nid2sn(curves[n].nid); - if (comment == NULL) - comment = "CURVE DESCRIPTION NOT AVAILABLE"; - if (sname == NULL) - sname = ""; - - BIO_printf(out, " %-10s: ", sname); - BIO_printf(out, "%s\n", comment); - } - - OPENSSL_free(curves); - ret = 0; - goto end; - } - - if (curve_name != NULL) { - int nid; - - /* - * workaround for the SECG curve names secp192r1 and secp256r1 (which - * are the same as the curves prime192v1 and prime256v1 defined in - * X9.62) - */ - if (strcmp(curve_name, "secp192r1") == 0) { - BIO_printf(bio_err, "using curve name prime192v1 " - "instead of secp192r1\n"); - nid = NID_X9_62_prime192v1; - } else if (strcmp(curve_name, "secp256r1") == 0) { - BIO_printf(bio_err, "using curve name prime256v1 " - "instead of secp256r1\n"); - nid = NID_X9_62_prime256v1; - } else { - nid = OBJ_sn2nid(curve_name); - } - - if (nid == 0) - nid = EC_curve_nist2nid(curve_name); - - if (nid == 0) { - BIO_printf(bio_err, "unknown curve name (%s)\n", curve_name); - goto end; - } - - group = EC_GROUP_new_by_curve_name(nid); - if (group == NULL) { - BIO_printf(bio_err, "unable to create curve (%s)\n", curve_name); - goto end; - } - EC_GROUP_set_asn1_flag(group, asn1_flag); - EC_GROUP_set_point_conversion_form(group, form); - } else if (informat == FORMAT_ASN1) { - group = d2i_ECPKParameters_bio(in, NULL); - } else { - group = PEM_read_bio_ECPKParameters(in, NULL, NULL, NULL); - } - if (group == NULL) { - BIO_printf(bio_err, "unable to load elliptic curve parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - - if (new_form) - EC_GROUP_set_point_conversion_form(group, form); - - if (new_asn1_flag) - EC_GROUP_set_asn1_flag(group, asn1_flag); - - if (no_seed) { - EC_GROUP_set_seed(group, NULL, 0); - } - - if (text) { - if (!ECPKParameters_print(out, group, 0)) - goto end; - } - - if (check) { - BIO_printf(bio_err, "checking elliptic curve parameters: "); - if (!EC_GROUP_check(group, NULL)) { - BIO_printf(bio_err, "failed\n"); - ERR_print_errors(bio_err); - goto end; - } - BIO_printf(bio_err, "ok\n"); - - } - - if (C) { - size_t buf_len = 0, tmp_len = 0; - const EC_POINT *point; - int is_prime, len = 0; - const EC_METHOD *meth = EC_GROUP_method_of(group); - - if ((ec_p = BN_new()) == NULL - || (ec_a = BN_new()) == NULL - || (ec_b = BN_new()) == NULL - || (ec_gen = BN_new()) == NULL - || (ec_order = BN_new()) == NULL - || (ec_cofactor = BN_new()) == NULL) { - perror("Can't allocate BN"); - goto end; - } - - is_prime = (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field); - if (!is_prime) { - BIO_printf(bio_err, "Can only handle X9.62 prime fields\n"); - goto end; - } - - if (!EC_GROUP_get_curve(group, ec_p, ec_a, ec_b, NULL)) - goto end; - - if ((point = EC_GROUP_get0_generator(group)) == NULL) - goto end; - if (!EC_POINT_point2bn(group, point, - EC_GROUP_get_point_conversion_form(group), - ec_gen, NULL)) - goto end; - if (!EC_GROUP_get_order(group, ec_order, NULL)) - goto end; - if (!EC_GROUP_get_cofactor(group, ec_cofactor, NULL)) - goto end; - - if (!ec_p || !ec_a || !ec_b || !ec_gen || !ec_order || !ec_cofactor) - goto end; - - len = BN_num_bits(ec_order); - - if ((tmp_len = (size_t)BN_num_bytes(ec_p)) > buf_len) - buf_len = tmp_len; - if ((tmp_len = (size_t)BN_num_bytes(ec_a)) > buf_len) - buf_len = tmp_len; - if ((tmp_len = (size_t)BN_num_bytes(ec_b)) > buf_len) - buf_len = tmp_len; - if ((tmp_len = (size_t)BN_num_bytes(ec_gen)) > buf_len) - buf_len = tmp_len; - if ((tmp_len = (size_t)BN_num_bytes(ec_order)) > buf_len) - buf_len = tmp_len; - if ((tmp_len = (size_t)BN_num_bytes(ec_cofactor)) > buf_len) - buf_len = tmp_len; - - buffer = app_malloc(buf_len, "BN buffer"); - - BIO_printf(out, "EC_GROUP *get_ec_group_%d(void)\n{\n", len); - print_bignum_var(out, ec_p, "ec_p", len, buffer); - print_bignum_var(out, ec_a, "ec_a", len, buffer); - print_bignum_var(out, ec_b, "ec_b", len, buffer); - print_bignum_var(out, ec_gen, "ec_gen", len, buffer); - print_bignum_var(out, ec_order, "ec_order", len, buffer); - print_bignum_var(out, ec_cofactor, "ec_cofactor", len, buffer); - BIO_printf(out, " int ok = 0;\n" - " EC_GROUP *group = NULL;\n" - " EC_POINT *point = NULL;\n" - " BIGNUM *tmp_1 = NULL;\n" - " BIGNUM *tmp_2 = NULL;\n" - " BIGNUM *tmp_3 = NULL;\n" - "\n"); - - BIO_printf(out, " if ((tmp_1 = BN_bin2bn(ec_p_%d, sizeof(ec_p_%d), NULL)) == NULL)\n" - " goto err;\n", len, len); - BIO_printf(out, " if ((tmp_2 = BN_bin2bn(ec_a_%d, sizeof(ec_a_%d), NULL)) == NULL)\n" - " goto err;\n", len, len); - BIO_printf(out, " if ((tmp_3 = BN_bin2bn(ec_b_%d, sizeof(ec_b_%d), NULL)) == NULL)\n" - " goto err;\n", len, len); - BIO_printf(out, " if ((group = EC_GROUP_new_curve_GFp(tmp_1, tmp_2, tmp_3, NULL)) == NULL)\n" - " goto err;\n" - "\n"); - BIO_printf(out, " /* build generator */\n"); - BIO_printf(out, " if ((tmp_1 = BN_bin2bn(ec_gen_%d, sizeof(ec_gen_%d), tmp_1)) == NULL)\n" - " goto err;\n", len, len); - BIO_printf(out, " point = EC_POINT_bn2point(group, tmp_1, NULL, NULL);\n"); - BIO_printf(out, " if (point == NULL)\n" - " goto err;\n"); - BIO_printf(out, " if ((tmp_2 = BN_bin2bn(ec_order_%d, sizeof(ec_order_%d), tmp_2)) == NULL)\n" - " goto err;\n", len, len); - BIO_printf(out, " if ((tmp_3 = BN_bin2bn(ec_cofactor_%d, sizeof(ec_cofactor_%d), tmp_3)) == NULL)\n" - " goto err;\n", len, len); - BIO_printf(out, " if (!EC_GROUP_set_generator(group, point, tmp_2, tmp_3))\n" - " goto err;\n" - "ok = 1;" - "\n"); - BIO_printf(out, "err:\n" - " BN_free(tmp_1);\n" - " BN_free(tmp_2);\n" - " BN_free(tmp_3);\n" - " EC_POINT_free(point);\n" - " if (!ok) {\n" - " EC_GROUP_free(group);\n" - " return NULL;\n" - " }\n" - " return (group);\n" - "}\n"); - } - - if (outformat == FORMAT_ASN1 && genkey) - noout = 1; - - if (!noout) { - if (outformat == FORMAT_ASN1) - i = i2d_ECPKParameters_bio(out, group); - else - i = PEM_write_bio_ECPKParameters(out, group); - if (!i) { - BIO_printf(bio_err, "unable to write elliptic " - "curve parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - } - - if (genkey) { - EC_KEY *eckey = EC_KEY_new(); - - if (eckey == NULL) - goto end; - - if (EC_KEY_set_group(eckey, group) == 0) { - BIO_printf(bio_err, "unable to set group when generating key\n"); - EC_KEY_free(eckey); - ERR_print_errors(bio_err); - goto end; - } - - if (new_form) - EC_KEY_set_conv_form(eckey, form); - - if (!EC_KEY_generate_key(eckey)) { - BIO_printf(bio_err, "unable to generate key\n"); - EC_KEY_free(eckey); - ERR_print_errors(bio_err); - goto end; - } - assert(private); - if (outformat == FORMAT_ASN1) - i = i2d_ECPrivateKey_bio(out, eckey); - else - i = PEM_write_bio_ECPrivateKey(out, eckey, NULL, - NULL, 0, NULL, NULL); - EC_KEY_free(eckey); - } - - ret = 0; - end: - BN_free(ec_p); - BN_free(ec_a); - BN_free(ec_b); - BN_free(ec_gen); - BN_free(ec_order); - BN_free(ec_cofactor); - OPENSSL_free(buffer); - EC_GROUP_free(group); - release_engine(e); - BIO_free(in); - BIO_free_all(out); - return ret; -} diff --git a/contrib/libs/openssl/apps/enc.c b/contrib/libs/openssl/apps/enc.c deleted file mode 100644 index 65710771a0..0000000000 --- a/contrib/libs/openssl/apps/enc.c +++ /dev/null @@ -1,676 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <limits.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/objects.h> -#include <openssl/x509.h> -#include <openssl/rand.h> -#include <openssl/pem.h> -#ifndef OPENSSL_NO_COMP -# include <openssl/comp.h> -#endif -#include <ctype.h> - -#undef SIZE -#undef BSIZE -#define SIZE (512) -#define BSIZE (8*1024) - -static int set_hex(const char *in, unsigned char *out, int size); -static void show_ciphers(const OBJ_NAME *name, void *bio_); - -struct doall_enc_ciphers { - BIO *bio; - int n; -}; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_LIST, - OPT_E, OPT_IN, OPT_OUT, OPT_PASS, OPT_ENGINE, OPT_D, OPT_P, OPT_V, - OPT_NOPAD, OPT_SALT, OPT_NOSALT, OPT_DEBUG, OPT_UPPER_P, OPT_UPPER_A, - OPT_A, OPT_Z, OPT_BUFSIZE, OPT_K, OPT_KFILE, OPT_UPPER_K, OPT_NONE, - OPT_UPPER_S, OPT_IV, OPT_MD, OPT_ITER, OPT_PBKDF2, OPT_CIPHER, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS enc_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"list", OPT_LIST, '-', "List ciphers"}, - {"ciphers", OPT_LIST, '-', "Alias for -list"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"pass", OPT_PASS, 's', "Passphrase source"}, - {"e", OPT_E, '-', "Encrypt"}, - {"d", OPT_D, '-', "Decrypt"}, - {"p", OPT_P, '-', "Print the iv/key"}, - {"P", OPT_UPPER_P, '-', "Print the iv/key and exit"}, - {"v", OPT_V, '-', "Verbose output"}, - {"nopad", OPT_NOPAD, '-', "Disable standard block padding"}, - {"salt", OPT_SALT, '-', "Use salt in the KDF (default)"}, - {"nosalt", OPT_NOSALT, '-', "Do not use salt in the KDF"}, - {"debug", OPT_DEBUG, '-', "Print debug info"}, - {"a", OPT_A, '-', "Base64 encode/decode, depending on encryption flag"}, - {"base64", OPT_A, '-', "Same as option -a"}, - {"A", OPT_UPPER_A, '-', - "Used with -[base64|a] to specify base64 buffer as a single line"}, - {"bufsize", OPT_BUFSIZE, 's', "Buffer size"}, - {"k", OPT_K, 's', "Passphrase"}, - {"kfile", OPT_KFILE, '<', "Read passphrase from file"}, - {"K", OPT_UPPER_K, 's', "Raw key, in hex"}, - {"S", OPT_UPPER_S, 's', "Salt, in hex"}, - {"iv", OPT_IV, 's', "IV in hex"}, - {"md", OPT_MD, 's', "Use specified digest to create a key from the passphrase"}, - {"iter", OPT_ITER, 'p', "Specify the iteration count and force use of PBKDF2"}, - {"pbkdf2", OPT_PBKDF2, '-', "Use password-based key derivation function 2"}, - {"none", OPT_NONE, '-', "Don't encrypt"}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, - OPT_R_OPTIONS, -#ifdef ZLIB - {"z", OPT_Z, '-', "Compress or decompress encrypted data using zlib"}, -#endif -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int enc_main(int argc, char **argv) -{ - static char buf[128]; - static const char magic[] = "Salted__"; - ENGINE *e = NULL; - BIO *in = NULL, *out = NULL, *b64 = NULL, *benc = NULL, *rbio = - NULL, *wbio = NULL; - EVP_CIPHER_CTX *ctx = NULL; - const EVP_CIPHER *cipher = NULL, *c; - const EVP_MD *dgst = NULL; - char *hkey = NULL, *hiv = NULL, *hsalt = NULL, *p; - char *infile = NULL, *outfile = NULL, *prog; - char *str = NULL, *passarg = NULL, *pass = NULL, *strbuf = NULL; - char mbuf[sizeof(magic) - 1]; - OPTION_CHOICE o; - int bsize = BSIZE, verbose = 0, debug = 0, olb64 = 0, nosalt = 0; - int enc = 1, printkey = 0, i, k; - int base64 = 0, informat = FORMAT_BINARY, outformat = FORMAT_BINARY; - int ret = 1, inl, nopad = 0; - unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH]; - unsigned char *buff = NULL, salt[PKCS5_SALT_LEN]; - int pbkdf2 = 0; - int iter = 0; - long n; - struct doall_enc_ciphers dec; -#ifdef ZLIB - int do_zlib = 0; - BIO *bzl = NULL; -#endif - - /* first check the program name */ - prog = opt_progname(argv[0]); - if (strcmp(prog, "base64") == 0) { - base64 = 1; -#ifdef ZLIB - } else if (strcmp(prog, "zlib") == 0) { - do_zlib = 1; -#endif - } else { - cipher = EVP_get_cipherbyname(prog); - if (cipher == NULL && strcmp(prog, "enc") != 0) { - BIO_printf(bio_err, "%s is not a known cipher\n", prog); - goto end; - } - } - - prog = opt_init(argc, argv, enc_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(enc_options); - ret = 0; - goto end; - case OPT_LIST: - BIO_printf(bio_out, "Supported ciphers:\n"); - dec.bio = bio_out; - dec.n = 0; - OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, - show_ciphers, &dec); - BIO_printf(bio_out, "\n"); - ret = 0; - goto end; - case OPT_E: - enc = 1; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PASS: - passarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_D: - enc = 0; - break; - case OPT_P: - printkey = 1; - break; - case OPT_V: - verbose = 1; - break; - case OPT_NOPAD: - nopad = 1; - break; - case OPT_SALT: - nosalt = 0; - break; - case OPT_NOSALT: - nosalt = 1; - break; - case OPT_DEBUG: - debug = 1; - break; - case OPT_UPPER_P: - printkey = 2; - break; - case OPT_UPPER_A: - olb64 = 1; - break; - case OPT_A: - base64 = 1; - break; - case OPT_Z: -#ifdef ZLIB - do_zlib = 1; -#endif - break; - case OPT_BUFSIZE: - p = opt_arg(); - i = (int)strlen(p) - 1; - k = i >= 1 && p[i] == 'k'; - if (k) - p[i] = '\0'; - if (!opt_long(opt_arg(), &n) - || n < 0 || (k && n >= LONG_MAX / 1024)) - goto opthelp; - if (k) - n *= 1024; - bsize = (int)n; - break; - case OPT_K: - str = opt_arg(); - break; - case OPT_KFILE: - in = bio_open_default(opt_arg(), 'r', FORMAT_TEXT); - if (in == NULL) - goto opthelp; - i = BIO_gets(in, buf, sizeof(buf)); - BIO_free(in); - in = NULL; - if (i <= 0) { - BIO_printf(bio_err, - "%s Can't read key from %s\n", prog, opt_arg()); - goto opthelp; - } - while (--i > 0 && (buf[i] == '\r' || buf[i] == '\n')) - buf[i] = '\0'; - if (i <= 0) { - BIO_printf(bio_err, "%s: zero length password\n", prog); - goto opthelp; - } - str = buf; - break; - case OPT_UPPER_K: - hkey = opt_arg(); - break; - case OPT_UPPER_S: - hsalt = opt_arg(); - break; - case OPT_IV: - hiv = opt_arg(); - break; - case OPT_MD: - if (!opt_md(opt_arg(), &dgst)) - goto opthelp; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &c)) - goto opthelp; - cipher = c; - break; - case OPT_ITER: - if (!opt_int(opt_arg(), &iter)) - goto opthelp; - pbkdf2 = 1; - break; - case OPT_PBKDF2: - pbkdf2 = 1; - if (iter == 0) /* do not overwrite a chosen value */ - iter = 10000; - break; - case OPT_NONE: - cipher = NULL; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - } - } - if (opt_num_rest() != 0) { - BIO_printf(bio_err, "Extra arguments given.\n"); - goto opthelp; - } - - if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) { - BIO_printf(bio_err, "%s: AEAD ciphers not supported\n", prog); - goto end; - } - - if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) { - BIO_printf(bio_err, "%s XTS ciphers not supported\n", prog); - goto end; - } - - if (dgst == NULL) - dgst = EVP_sha256(); - - if (iter == 0) - iter = 1; - - /* It must be large enough for a base64 encoded line */ - if (base64 && bsize < 80) - bsize = 80; - if (verbose) - BIO_printf(bio_err, "bufsize=%d\n", bsize); - -#ifdef ZLIB - if (!do_zlib) -#endif - if (base64) { - if (enc) - outformat = FORMAT_BASE64; - else - informat = FORMAT_BASE64; - } - - strbuf = app_malloc(SIZE, "strbuf"); - buff = app_malloc(EVP_ENCODE_LENGTH(bsize), "evp buffer"); - - if (infile == NULL) { - in = dup_bio_in(informat); - } else { - in = bio_open_default(infile, 'r', informat); - } - if (in == NULL) - goto end; - - if (str == NULL && passarg != NULL) { - if (!app_passwd(passarg, NULL, &pass, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - str = pass; - } - - if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) { - if (1) { -#ifndef OPENSSL_NO_UI_CONSOLE - for (;;) { - char prompt[200]; - - BIO_snprintf(prompt, sizeof(prompt), "enter %s %s password:", - OBJ_nid2ln(EVP_CIPHER_nid(cipher)), - (enc) ? "encryption" : "decryption"); - strbuf[0] = '\0'; - i = EVP_read_pw_string((char *)strbuf, SIZE, prompt, enc); - if (i == 0) { - if (strbuf[0] == '\0') { - ret = 1; - goto end; - } - str = strbuf; - break; - } - if (i < 0) { - BIO_printf(bio_err, "bad password read\n"); - goto end; - } - } - } else { -#endif - BIO_printf(bio_err, "password required\n"); - goto end; - } - } - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if (debug) { - BIO_set_callback(in, BIO_debug_callback); - BIO_set_callback(out, BIO_debug_callback); - BIO_set_callback_arg(in, (char *)bio_err); - BIO_set_callback_arg(out, (char *)bio_err); - } - - rbio = in; - wbio = out; - -#ifdef ZLIB - if (do_zlib) { - if ((bzl = BIO_new(BIO_f_zlib())) == NULL) - goto end; - if (debug) { - BIO_set_callback(bzl, BIO_debug_callback); - BIO_set_callback_arg(bzl, (char *)bio_err); - } - if (enc) - wbio = BIO_push(bzl, wbio); - else - rbio = BIO_push(bzl, rbio); - } -#endif - - if (base64) { - if ((b64 = BIO_new(BIO_f_base64())) == NULL) - goto end; - if (debug) { - BIO_set_callback(b64, BIO_debug_callback); - BIO_set_callback_arg(b64, (char *)bio_err); - } - if (olb64) - BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - if (enc) - wbio = BIO_push(b64, wbio); - else - rbio = BIO_push(b64, rbio); - } - - if (cipher != NULL) { - /* - * Note that str is NULL if a key was passed on the command line, so - * we get no salt in that case. Is this a bug? - */ - if (str != NULL) { - /* - * Salt handling: if encrypting generate a salt and write to - * output BIO. If decrypting read salt from input BIO. - */ - unsigned char *sptr; - size_t str_len = strlen(str); - - if (nosalt) { - sptr = NULL; - } else { - if (enc) { - if (hsalt) { - if (!set_hex(hsalt, salt, sizeof(salt))) { - BIO_printf(bio_err, "invalid hex salt value\n"); - goto end; - } - } else if (RAND_bytes(salt, sizeof(salt)) <= 0) { - goto end; - } - /* - * If -P option then don't bother writing - */ - if ((printkey != 2) - && (BIO_write(wbio, magic, - sizeof(magic) - 1) != sizeof(magic) - 1 - || BIO_write(wbio, - (char *)salt, - sizeof(salt)) != sizeof(salt))) { - BIO_printf(bio_err, "error writing output file\n"); - goto end; - } - } else if (BIO_read(rbio, mbuf, sizeof(mbuf)) != sizeof(mbuf) - || BIO_read(rbio, - (unsigned char *)salt, - sizeof(salt)) != sizeof(salt)) { - BIO_printf(bio_err, "error reading input file\n"); - goto end; - } else if (memcmp(mbuf, magic, sizeof(magic) - 1)) { - BIO_printf(bio_err, "bad magic number\n"); - goto end; - } - sptr = salt; - } - - if (pbkdf2 == 1) { - /* - * derive key and default iv - * concatenated into a temporary buffer - */ - unsigned char tmpkeyiv[EVP_MAX_KEY_LENGTH + EVP_MAX_IV_LENGTH]; - int iklen = EVP_CIPHER_key_length(cipher); - int ivlen = EVP_CIPHER_iv_length(cipher); - /* not needed if HASH_UPDATE() is fixed : */ - int islen = (sptr != NULL ? sizeof(salt) : 0); - if (!PKCS5_PBKDF2_HMAC(str, str_len, sptr, islen, - iter, dgst, iklen+ivlen, tmpkeyiv)) { - BIO_printf(bio_err, "PKCS5_PBKDF2_HMAC failed\n"); - goto end; - } - /* split and move data back to global buffer */ - memcpy(key, tmpkeyiv, iklen); - memcpy(iv, tmpkeyiv+iklen, ivlen); - } else { - BIO_printf(bio_err, "*** WARNING : " - "deprecated key derivation used.\n" - "Using -iter or -pbkdf2 would be better.\n"); - if (!EVP_BytesToKey(cipher, dgst, sptr, - (unsigned char *)str, str_len, - 1, key, iv)) { - BIO_printf(bio_err, "EVP_BytesToKey failed\n"); - goto end; - } - } - /* - * zero the complete buffer or the string passed from the command - * line. - */ - if (str == strbuf) - OPENSSL_cleanse(str, SIZE); - else - OPENSSL_cleanse(str, str_len); - } - if (hiv != NULL) { - int siz = EVP_CIPHER_iv_length(cipher); - if (siz == 0) { - BIO_printf(bio_err, "warning: iv not used by this cipher\n"); - } else if (!set_hex(hiv, iv, siz)) { - BIO_printf(bio_err, "invalid hex iv value\n"); - goto end; - } - } - if ((hiv == NULL) && (str == NULL) - && EVP_CIPHER_iv_length(cipher) != 0) { - /* - * No IV was explicitly set and no IV was generated. - * Hence the IV is undefined, making correct decryption impossible. - */ - BIO_printf(bio_err, "iv undefined\n"); - goto end; - } - if (hkey != NULL) { - if (!set_hex(hkey, key, EVP_CIPHER_key_length(cipher))) { - BIO_printf(bio_err, "invalid hex key value\n"); - goto end; - } - /* wiping secret data as we no longer need it */ - OPENSSL_cleanse(hkey, strlen(hkey)); - } - - if ((benc = BIO_new(BIO_f_cipher())) == NULL) - goto end; - - /* - * Since we may be changing parameters work on the encryption context - * rather than calling BIO_set_cipher(). - */ - - BIO_get_cipher_ctx(benc, &ctx); - - if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) { - BIO_printf(bio_err, "Error setting cipher %s\n", - EVP_CIPHER_name(cipher)); - ERR_print_errors(bio_err); - goto end; - } - - if (nopad) - EVP_CIPHER_CTX_set_padding(ctx, 0); - - if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc)) { - BIO_printf(bio_err, "Error setting cipher %s\n", - EVP_CIPHER_name(cipher)); - ERR_print_errors(bio_err); - goto end; - } - - if (debug) { - BIO_set_callback(benc, BIO_debug_callback); - BIO_set_callback_arg(benc, (char *)bio_err); - } - - if (printkey) { - if (!nosalt) { - printf("salt="); - for (i = 0; i < (int)sizeof(salt); i++) - printf("%02X", salt[i]); - printf("\n"); - } - if (EVP_CIPHER_key_length(cipher) > 0) { - printf("key="); - for (i = 0; i < EVP_CIPHER_key_length(cipher); i++) - printf("%02X", key[i]); - printf("\n"); - } - if (EVP_CIPHER_iv_length(cipher) > 0) { - printf("iv ="); - for (i = 0; i < EVP_CIPHER_iv_length(cipher); i++) - printf("%02X", iv[i]); - printf("\n"); - } - if (printkey == 2) { - ret = 0; - goto end; - } - } - } - - /* Only encrypt/decrypt as we write the file */ - if (benc != NULL) - wbio = BIO_push(benc, wbio); - - while (BIO_pending(rbio) || !BIO_eof(rbio)) { - inl = BIO_read(rbio, (char *)buff, bsize); - if (inl <= 0) - break; - if (BIO_write(wbio, (char *)buff, inl) != inl) { - BIO_printf(bio_err, "error writing output file\n"); - goto end; - } - } - if (!BIO_flush(wbio)) { - BIO_printf(bio_err, "bad decrypt\n"); - goto end; - } - - ret = 0; - if (verbose) { - BIO_printf(bio_err, "bytes read : %8ju\n", BIO_number_read(in)); - BIO_printf(bio_err, "bytes written: %8ju\n", BIO_number_written(out)); - } - end: - ERR_print_errors(bio_err); - OPENSSL_free(strbuf); - OPENSSL_free(buff); - BIO_free(in); - BIO_free_all(out); - BIO_free(benc); - BIO_free(b64); -#ifdef ZLIB - BIO_free(bzl); -#endif - release_engine(e); - OPENSSL_free(pass); - return ret; -} - -static void show_ciphers(const OBJ_NAME *name, void *arg) -{ - struct doall_enc_ciphers *dec = (struct doall_enc_ciphers *)arg; - const EVP_CIPHER *cipher; - - if (!islower((unsigned char)*name->name)) - return; - - /* Filter out ciphers that we cannot use */ - cipher = EVP_get_cipherbyname(name->name); - if (cipher == NULL || - (EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) != 0 || - EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE) - return; - - BIO_printf(dec->bio, "-%-25s", name->name); - if (++dec->n == 3) { - BIO_printf(dec->bio, "\n"); - dec->n = 0; - } else - BIO_printf(dec->bio, " "); -} - -static int set_hex(const char *in, unsigned char *out, int size) -{ - int i, n; - unsigned char j; - - i = size * 2; - n = strlen(in); - if (n > i) { - BIO_printf(bio_err, "hex string is too long, ignoring excess\n"); - n = i; /* ignore exceeding part */ - } else if (n < i) { - BIO_printf(bio_err, "hex string is too short, padding with zero bytes to length\n"); - } - - memset(out, 0, size); - for (i = 0; i < n; i++) { - j = (unsigned char)*in++; - if (!isxdigit(j)) { - BIO_printf(bio_err, "non-hex digit\n"); - return 0; - } - j = (unsigned char)OPENSSL_hexchar2int(j); - if (i & 1) - out[i / 2] |= j; - else - out[i / 2] = (j << 4); - } - return 1; -} diff --git a/contrib/libs/openssl/apps/engine.c b/contrib/libs/openssl/apps/engine.c deleted file mode 100644 index 746cace354..0000000000 --- a/contrib/libs/openssl/apps/engine.c +++ /dev/null @@ -1,484 +0,0 @@ -/* - * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include "apps.h" -#include "progs.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <openssl/err.h> -#include <openssl/engine.h> -#include <openssl/ssl.h> -#include <openssl/store.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_C, OPT_T, OPT_TT, OPT_PRE, OPT_POST, - OPT_V = 100, OPT_VV, OPT_VVV, OPT_VVVV -} OPTION_CHOICE; - -const OPTIONS engine_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] engine...\n"}, - {OPT_HELP_STR, 1, '-', - " engine... Engines to load\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"v", OPT_V, '-', "List 'control commands' For each specified engine"}, - {"vv", OPT_VV, '-', "Also display each command's description"}, - {"vvv", OPT_VVV, '-', "Also add the input flags for each command"}, - {"vvvv", OPT_VVVV, '-', "Also show internal input flags"}, - {"c", OPT_C, '-', "List the capabilities of specified engine"}, - {"t", OPT_T, '-', "Check that specified engine is available"}, - {"tt", OPT_TT, '-', "Display error trace for unavailable engines"}, - {"pre", OPT_PRE, 's', "Run command against the ENGINE before loading it"}, - {"post", OPT_POST, 's', "Run command against the ENGINE after loading it"}, - {OPT_MORE_STR, OPT_EOF, 1, - "Commands are like \"SO_PATH:/lib/libdriver.so\""}, - {NULL} -}; - -static int append_buf(char **buf, int *size, const char *s) -{ - const int expand = 256; - int len = strlen(s) + 1; - char *p = *buf; - - if (p == NULL) { - *size = ((len + expand - 1) / expand) * expand; - p = *buf = app_malloc(*size, "engine buffer"); - } else { - const int blen = strlen(p); - - if (blen > 0) - len += 2 + blen; - - if (len > *size) { - *size = ((len + expand - 1) / expand) * expand; - p = OPENSSL_realloc(p, *size); - if (p == NULL) { - OPENSSL_free(*buf); - *buf = NULL; - return 0; - } - *buf = p; - } - - if (blen > 0) { - p += blen; - *p++ = ','; - *p++ = ' '; - } - } - - strcpy(p, s); - return 1; -} - -static int util_flags(BIO *out, unsigned int flags, const char *indent) -{ - int started = 0, err = 0; - /* Indent before displaying input flags */ - BIO_printf(out, "%s%s(input flags): ", indent, indent); - if (flags == 0) { - BIO_printf(out, "<no flags>\n"); - return 1; - } - /* - * If the object is internal, mark it in a way that shows instead of - * having it part of all the other flags, even if it really is. - */ - if (flags & ENGINE_CMD_FLAG_INTERNAL) { - BIO_printf(out, "[Internal] "); - } - - if (flags & ENGINE_CMD_FLAG_NUMERIC) { - BIO_printf(out, "NUMERIC"); - started = 1; - } - /* - * Now we check that no combinations of the mutually exclusive NUMERIC, - * STRING, and NO_INPUT flags have been used. Future flags that can be - * OR'd together with these would need to added after these to preserve - * the testing logic. - */ - if (flags & ENGINE_CMD_FLAG_STRING) { - if (started) { - BIO_printf(out, "|"); - err = 1; - } - BIO_printf(out, "STRING"); - started = 1; - } - if (flags & ENGINE_CMD_FLAG_NO_INPUT) { - if (started) { - BIO_printf(out, "|"); - err = 1; - } - BIO_printf(out, "NO_INPUT"); - started = 1; - } - /* Check for unknown flags */ - flags = flags & ~ENGINE_CMD_FLAG_NUMERIC & - ~ENGINE_CMD_FLAG_STRING & - ~ENGINE_CMD_FLAG_NO_INPUT & ~ENGINE_CMD_FLAG_INTERNAL; - if (flags) { - if (started) - BIO_printf(out, "|"); - BIO_printf(out, "<0x%04X>", flags); - } - if (err) - BIO_printf(out, " <illegal flags!>"); - BIO_printf(out, "\n"); - return 1; -} - -static int util_verbose(ENGINE *e, int verbose, BIO *out, const char *indent) -{ - static const int line_wrap = 78; - int num; - int ret = 0; - char *name = NULL; - char *desc = NULL; - int flags; - int xpos = 0; - STACK_OF(OPENSSL_STRING) *cmds = NULL; - if (!ENGINE_ctrl(e, ENGINE_CTRL_HAS_CTRL_FUNCTION, 0, NULL, NULL) || - ((num = ENGINE_ctrl(e, ENGINE_CTRL_GET_FIRST_CMD_TYPE, - 0, NULL, NULL)) <= 0)) { - return 1; - } - - cmds = sk_OPENSSL_STRING_new_null(); - if (cmds == NULL) - goto err; - - do { - int len; - /* Get the command input flags */ - if ((flags = ENGINE_ctrl(e, ENGINE_CTRL_GET_CMD_FLAGS, num, - NULL, NULL)) < 0) - goto err; - if (!(flags & ENGINE_CMD_FLAG_INTERNAL) || verbose >= 4) { - /* Get the command name */ - if ((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_LEN_FROM_CMD, num, - NULL, NULL)) <= 0) - goto err; - name = app_malloc(len + 1, "name buffer"); - if (ENGINE_ctrl(e, ENGINE_CTRL_GET_NAME_FROM_CMD, num, name, - NULL) <= 0) - goto err; - /* Get the command description */ - if ((len = ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_LEN_FROM_CMD, num, - NULL, NULL)) < 0) - goto err; - if (len > 0) { - desc = app_malloc(len + 1, "description buffer"); - if (ENGINE_ctrl(e, ENGINE_CTRL_GET_DESC_FROM_CMD, num, desc, - NULL) <= 0) - goto err; - } - /* Now decide on the output */ - if (xpos == 0) - /* Do an indent */ - xpos = BIO_puts(out, indent); - else - /* Otherwise prepend a ", " */ - xpos += BIO_printf(out, ", "); - if (verbose == 1) { - /* - * We're just listing names, comma-delimited - */ - if ((xpos > (int)strlen(indent)) && - (xpos + (int)strlen(name) > line_wrap)) { - BIO_printf(out, "\n"); - xpos = BIO_puts(out, indent); - } - xpos += BIO_printf(out, "%s", name); - } else { - /* We're listing names plus descriptions */ - BIO_printf(out, "%s: %s\n", name, - (desc == NULL) ? "<no description>" : desc); - /* ... and sometimes input flags */ - if ((verbose >= 3) && !util_flags(out, flags, indent)) - goto err; - xpos = 0; - } - } - OPENSSL_free(name); - name = NULL; - OPENSSL_free(desc); - desc = NULL; - /* Move to the next command */ - num = ENGINE_ctrl(e, ENGINE_CTRL_GET_NEXT_CMD_TYPE, num, NULL, NULL); - } while (num > 0); - if (xpos > 0) - BIO_printf(out, "\n"); - ret = 1; - err: - sk_OPENSSL_STRING_free(cmds); - OPENSSL_free(name); - OPENSSL_free(desc); - return ret; -} - -static void util_do_cmds(ENGINE *e, STACK_OF(OPENSSL_STRING) *cmds, - BIO *out, const char *indent) -{ - int loop, res, num = sk_OPENSSL_STRING_num(cmds); - - if (num < 0) { - BIO_printf(out, "[Error]: internal stack error\n"); - return; - } - for (loop = 0; loop < num; loop++) { - char buf[256]; - const char *cmd, *arg; - cmd = sk_OPENSSL_STRING_value(cmds, loop); - res = 1; /* assume success */ - /* Check if this command has no ":arg" */ - if ((arg = strstr(cmd, ":")) == NULL) { - if (!ENGINE_ctrl_cmd_string(e, cmd, NULL, 0)) - res = 0; - } else { - if ((int)(arg - cmd) > 254) { - BIO_printf(out, "[Error]: command name too long\n"); - return; - } - memcpy(buf, cmd, (int)(arg - cmd)); - buf[arg - cmd] = '\0'; - arg++; /* Move past the ":" */ - /* Call the command with the argument */ - if (!ENGINE_ctrl_cmd_string(e, buf, arg, 0)) - res = 0; - } - if (res) { - BIO_printf(out, "[Success]: %s\n", cmd); - } else { - BIO_printf(out, "[Failure]: %s\n", cmd); - ERR_print_errors(out); - } - } -} - -struct util_store_cap_data { - ENGINE *engine; - char **cap_buf; - int *cap_size; - int ok; -}; -static void util_store_cap(const OSSL_STORE_LOADER *loader, void *arg) -{ - struct util_store_cap_data *ctx = arg; - - if (OSSL_STORE_LOADER_get0_engine(loader) == ctx->engine) { - char buf[256]; - BIO_snprintf(buf, sizeof(buf), "STORE(%s)", - OSSL_STORE_LOADER_get0_scheme(loader)); - if (!append_buf(ctx->cap_buf, ctx->cap_size, buf)) - ctx->ok = 0; - } -} - -int engine_main(int argc, char **argv) -{ - int ret = 1, i; - int verbose = 0, list_cap = 0, test_avail = 0, test_avail_noise = 0; - ENGINE *e; - STACK_OF(OPENSSL_CSTRING) *engines = sk_OPENSSL_CSTRING_new_null(); - STACK_OF(OPENSSL_STRING) *pre_cmds = sk_OPENSSL_STRING_new_null(); - STACK_OF(OPENSSL_STRING) *post_cmds = sk_OPENSSL_STRING_new_null(); - BIO *out; - const char *indent = " "; - OPTION_CHOICE o; - char *prog; - char *argv1; - - out = dup_bio_out(FORMAT_TEXT); - if (engines == NULL || pre_cmds == NULL || post_cmds == NULL) - goto end; - - /* Remember the original command name, parse/skip any leading engine - * names, and then setup to parse the rest of the line as flags. */ - prog = argv[0]; - while ((argv1 = argv[1]) != NULL && *argv1 != '-') { - sk_OPENSSL_CSTRING_push(engines, argv1); - argc--; - argv++; - } - argv[0] = prog; - opt_init(argc, argv, engine_options); - - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(engine_options); - ret = 0; - goto end; - case OPT_VVVV: - case OPT_VVV: - case OPT_VV: - case OPT_V: - /* Convert to an integer from one to four. */ - i = (int)(o - OPT_V) + 1; - if (verbose < i) - verbose = i; - break; - case OPT_C: - list_cap = 1; - break; - case OPT_TT: - test_avail_noise++; - /* fall thru */ - case OPT_T: - test_avail++; - break; - case OPT_PRE: - sk_OPENSSL_STRING_push(pre_cmds, opt_arg()); - break; - case OPT_POST: - sk_OPENSSL_STRING_push(post_cmds, opt_arg()); - break; - } - } - - /* Allow any trailing parameters as engine names. */ - argc = opt_num_rest(); - argv = opt_rest(); - for ( ; *argv; argv++) { - if (**argv == '-') { - BIO_printf(bio_err, "%s: Cannot mix flags and engine names.\n", - prog); - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - } - sk_OPENSSL_CSTRING_push(engines, *argv); - } - - if (sk_OPENSSL_CSTRING_num(engines) == 0) { - for (e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e)) { - sk_OPENSSL_CSTRING_push(engines, ENGINE_get_id(e)); - } - } - - ret = 0; - for (i = 0; i < sk_OPENSSL_CSTRING_num(engines); i++) { - const char *id = sk_OPENSSL_CSTRING_value(engines, i); - if ((e = ENGINE_by_id(id)) != NULL) { - const char *name = ENGINE_get_name(e); - /* - * Do "id" first, then "name". Easier to auto-parse. - */ - BIO_printf(out, "(%s) %s\n", id, name); - util_do_cmds(e, pre_cmds, out, indent); - if (strcmp(ENGINE_get_id(e), id) != 0) { - BIO_printf(out, "Loaded: (%s) %s\n", - ENGINE_get_id(e), ENGINE_get_name(e)); - } - if (list_cap) { - int cap_size = 256; - char *cap_buf = NULL; - int k, n; - const int *nids; - ENGINE_CIPHERS_PTR fn_c; - ENGINE_DIGESTS_PTR fn_d; - ENGINE_PKEY_METHS_PTR fn_pk; - - if (ENGINE_get_RSA(e) != NULL - && !append_buf(&cap_buf, &cap_size, "RSA")) - goto end; - if (ENGINE_get_DSA(e) != NULL - && !append_buf(&cap_buf, &cap_size, "DSA")) - goto end; - if (ENGINE_get_DH(e) != NULL - && !append_buf(&cap_buf, &cap_size, "DH")) - goto end; - if (ENGINE_get_RAND(e) != NULL - && !append_buf(&cap_buf, &cap_size, "RAND")) - goto end; - - fn_c = ENGINE_get_ciphers(e); - if (fn_c == NULL) - goto skip_ciphers; - n = fn_c(e, NULL, &nids, 0); - for (k = 0; k < n; ++k) - if (!append_buf(&cap_buf, &cap_size, OBJ_nid2sn(nids[k]))) - goto end; - - skip_ciphers: - fn_d = ENGINE_get_digests(e); - if (fn_d == NULL) - goto skip_digests; - n = fn_d(e, NULL, &nids, 0); - for (k = 0; k < n; ++k) - if (!append_buf(&cap_buf, &cap_size, OBJ_nid2sn(nids[k]))) - goto end; - - skip_digests: - fn_pk = ENGINE_get_pkey_meths(e); - if (fn_pk == NULL) - goto skip_pmeths; - n = fn_pk(e, NULL, &nids, 0); - for (k = 0; k < n; ++k) - if (!append_buf(&cap_buf, &cap_size, OBJ_nid2sn(nids[k]))) - goto end; - skip_pmeths: - { - struct util_store_cap_data store_ctx; - - store_ctx.engine = e; - store_ctx.cap_buf = &cap_buf; - store_ctx.cap_size = &cap_size; - store_ctx.ok = 1; - - OSSL_STORE_do_all_loaders(util_store_cap, &store_ctx); - if (!store_ctx.ok) - goto end; - } - if (cap_buf != NULL && (*cap_buf != '\0')) - BIO_printf(out, " [%s]\n", cap_buf); - - OPENSSL_free(cap_buf); - } - if (test_avail) { - BIO_printf(out, "%s", indent); - if (ENGINE_init(e)) { - BIO_printf(out, "[ available ]\n"); - util_do_cmds(e, post_cmds, out, indent); - ENGINE_finish(e); - } else { - BIO_printf(out, "[ unavailable ]\n"); - if (test_avail_noise) - ERR_print_errors_fp(stdout); - ERR_clear_error(); - } - } - if ((verbose > 0) && !util_verbose(e, verbose, out, indent)) - goto end; - ENGINE_free(e); - } else { - ERR_print_errors(bio_err); - /* because exit codes above 127 have special meaning on Unix */ - if (++ret > 127) - ret = 127; - } - } - - end: - - ERR_print_errors(bio_err); - sk_OPENSSL_CSTRING_free(engines); - sk_OPENSSL_STRING_free(pre_cmds); - sk_OPENSSL_STRING_free(post_cmds); - BIO_free_all(out); - return ret; -} diff --git a/contrib/libs/openssl/apps/errstr.c b/contrib/libs/openssl/apps/errstr.c deleted file mode 100644 index 3ef01f076a..0000000000 --- a/contrib/libs/openssl/apps/errstr.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/ssl.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP -} OPTION_CHOICE; - -const OPTIONS errstr_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] errnum...\n"}, - {OPT_HELP_STR, 1, '-', " errnum Error number\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {NULL} -}; - -int errstr_main(int argc, char **argv) -{ - OPTION_CHOICE o; - char buf[256], *prog; - int ret = 1; - unsigned long l; - - prog = opt_init(argc, argv, errstr_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(errstr_options); - ret = 0; - goto end; - } - } - - ret = 0; - for (argv = opt_rest(); *argv; argv++) { - if (sscanf(*argv, "%lx", &l) == 0) { - ret++; - } else { - /* We're not really an SSL application so this won't auto-init, but - * we're still interested in SSL error strings - */ - OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS - | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); - ERR_error_string_n(l, buf, sizeof(buf)); - BIO_printf(bio_out, "%s\n", buf); - } - } - end: - return ret; -} diff --git a/contrib/libs/openssl/apps/gendsa.c b/contrib/libs/openssl/apps/gendsa.c deleted file mode 100644 index ec57c92a94..0000000000 --- a/contrib/libs/openssl/apps/gendsa.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/dsa.h> -#include <openssl/x509.h> -#include <openssl/pem.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_OUT, OPT_PASSOUT, OPT_ENGINE, OPT_CIPHER, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS gendsa_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [args] dsaparam-file\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"out", OPT_OUT, '>', "Output the key to the specified file"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - OPT_R_OPTIONS, - {"", OPT_CIPHER, '-', "Encrypt the output with any supported cipher"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int gendsa_main(int argc, char **argv) -{ - ENGINE *e = NULL; - BIO *out = NULL, *in = NULL; - DSA *dsa = NULL; - const EVP_CIPHER *enc = NULL; - char *dsaparams = NULL; - char *outfile = NULL, *passoutarg = NULL, *passout = NULL, *prog; - OPTION_CHOICE o; - int ret = 1, private = 0; - const BIGNUM *p = NULL; - - prog = opt_init(argc, argv, gendsa_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - ret = 0; - opt_help(gendsa_options); - goto end; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &enc)) - goto end; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - private = 1; - - if (argc != 1) - goto opthelp; - dsaparams = *argv; - - if (!app_passwd(NULL, passoutarg, NULL, &passout)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - in = bio_open_default(dsaparams, 'r', FORMAT_PEM); - if (in == NULL) - goto end2; - - if ((dsa = PEM_read_bio_DSAparams(in, NULL, NULL, NULL)) == NULL) { - BIO_printf(bio_err, "unable to load DSA parameter file\n"); - goto end; - } - BIO_free(in); - in = NULL; - - out = bio_open_owner(outfile, FORMAT_PEM, private); - if (out == NULL) - goto end2; - - DSA_get0_pqg(dsa, &p, NULL, NULL); - - if (BN_num_bits(p) > OPENSSL_DSA_MAX_MODULUS_BITS) - BIO_printf(bio_err, - "Warning: It is not recommended to use more than %d bit for DSA keys.\n" - " Your key size is %d! Larger key size may behave not as expected.\n", - OPENSSL_DSA_MAX_MODULUS_BITS, BN_num_bits(p)); - - BIO_printf(bio_err, "Generating DSA key, %d bits\n", BN_num_bits(p)); - if (!DSA_generate_key(dsa)) - goto end; - - assert(private); - if (!PEM_write_bio_DSAPrivateKey(out, dsa, enc, NULL, 0, NULL, passout)) - goto end; - ret = 0; - end: - if (ret != 0) - ERR_print_errors(bio_err); - end2: - BIO_free(in); - BIO_free_all(out); - DSA_free(dsa); - release_engine(e); - OPENSSL_free(passout); - return ret; -} diff --git a/contrib/libs/openssl/apps/genpkey.c b/contrib/libs/openssl/apps/genpkey.c deleted file mode 100644 index 3fe87e853c..0000000000 --- a/contrib/libs/openssl/apps/genpkey.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/pem.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#ifndef OPENSSL_NO_ENGINE -# include <openssl/engine.h> -#endif - -static int init_keygen_file(EVP_PKEY_CTX **pctx, const char *file, ENGINE *e); -static int genpkey_cb(EVP_PKEY_CTX *ctx); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENGINE, OPT_OUTFORM, OPT_OUT, OPT_PASS, OPT_PARAMFILE, - OPT_ALGORITHM, OPT_PKEYOPT, OPT_GENPARAM, OPT_TEXT, OPT_CIPHER -} OPTION_CHOICE; - -const OPTIONS genpkey_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"out", OPT_OUT, '>', "Output file"}, - {"outform", OPT_OUTFORM, 'F', "output format (DER or PEM)"}, - {"pass", OPT_PASS, 's', "Output file pass phrase source"}, - {"paramfile", OPT_PARAMFILE, '<', "Parameters file"}, - {"algorithm", OPT_ALGORITHM, 's', "The public key algorithm"}, - {"pkeyopt", OPT_PKEYOPT, 's', - "Set the public key algorithm option as opt:value"}, - {"genparam", OPT_GENPARAM, '-', "Generate parameters, not key"}, - {"text", OPT_TEXT, '-', "Print the in text"}, - {"", OPT_CIPHER, '-', "Cipher to use to encrypt the key"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - /* This is deliberately last. */ - {OPT_HELP_STR, 1, 1, - "Order of options may be important! See the documentation.\n"}, - {NULL} -}; - -int genpkey_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL; - EVP_PKEY *pkey = NULL; - EVP_PKEY_CTX *ctx = NULL; - char *outfile = NULL, *passarg = NULL, *pass = NULL, *prog; - const EVP_CIPHER *cipher = NULL; - OPTION_CHOICE o; - int outformat = FORMAT_PEM, text = 0, ret = 1, rv, do_param = 0; - int private = 0; - - prog = opt_init(argc, argv, genpkey_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - ret = 0; - opt_help(genpkey_options); - goto end; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PASS: - passarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_PARAMFILE: - if (do_param == 1) - goto opthelp; - if (!init_keygen_file(&ctx, opt_arg(), e)) - goto end; - break; - case OPT_ALGORITHM: - if (!init_gen_str(&ctx, opt_arg(), e, do_param)) - goto end; - break; - case OPT_PKEYOPT: - if (ctx == NULL) { - BIO_printf(bio_err, "%s: No keytype specified.\n", prog); - goto opthelp; - } - if (pkey_ctrl_string(ctx, opt_arg()) <= 0) { - BIO_printf(bio_err, - "%s: Error setting %s parameter:\n", - prog, opt_arg()); - ERR_print_errors(bio_err); - goto end; - } - break; - case OPT_GENPARAM: - if (ctx != NULL) - goto opthelp; - do_param = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &cipher) - || do_param == 1) - goto opthelp; - if (EVP_CIPHER_mode(cipher) == EVP_CIPH_GCM_MODE || - EVP_CIPHER_mode(cipher) == EVP_CIPH_CCM_MODE || - EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE || - EVP_CIPHER_mode(cipher) == EVP_CIPH_OCB_MODE) { - BIO_printf(bio_err, "%s: cipher mode not supported\n", prog); - goto end; - } - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = do_param ? 0 : 1; - - if (ctx == NULL) - goto opthelp; - - if (!app_passwd(passarg, NULL, &pass, NULL)) { - BIO_puts(bio_err, "Error getting password\n"); - goto end; - } - - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - EVP_PKEY_CTX_set_cb(ctx, genpkey_cb); - EVP_PKEY_CTX_set_app_data(ctx, bio_err); - - if (do_param) { - if (EVP_PKEY_paramgen(ctx, &pkey) <= 0) { - BIO_puts(bio_err, "Error generating parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - } else { - if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { - BIO_puts(bio_err, "Error generating key\n"); - ERR_print_errors(bio_err); - goto end; - } - } - - if (do_param) { - rv = PEM_write_bio_Parameters(out, pkey); - } else if (outformat == FORMAT_PEM) { - assert(private); - rv = PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, NULL, pass); - } else if (outformat == FORMAT_ASN1) { - assert(private); - rv = i2d_PrivateKey_bio(out, pkey); - } else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - - ret = 0; - - if (rv <= 0) { - BIO_puts(bio_err, "Error writing key\n"); - ERR_print_errors(bio_err); - ret = 1; - } - - if (text) { - if (do_param) - rv = EVP_PKEY_print_params(out, pkey, 0, NULL); - else - rv = EVP_PKEY_print_private(out, pkey, 0, NULL); - - if (rv <= 0) { - BIO_puts(bio_err, "Error printing key\n"); - ERR_print_errors(bio_err); - ret = 1; - } - } - - end: - EVP_PKEY_free(pkey); - EVP_PKEY_CTX_free(ctx); - BIO_free_all(out); - BIO_free(in); - release_engine(e); - OPENSSL_free(pass); - return ret; -} - -static int init_keygen_file(EVP_PKEY_CTX **pctx, const char *file, ENGINE *e) -{ - BIO *pbio; - EVP_PKEY *pkey = NULL; - EVP_PKEY_CTX *ctx = NULL; - if (*pctx) { - BIO_puts(bio_err, "Parameters already set!\n"); - return 0; - } - - pbio = BIO_new_file(file, "r"); - if (!pbio) { - BIO_printf(bio_err, "Can't open parameter file %s\n", file); - return 0; - } - - pkey = PEM_read_bio_Parameters(pbio, NULL); - BIO_free(pbio); - - if (!pkey) { - BIO_printf(bio_err, "Error reading parameter file %s\n", file); - return 0; - } - - ctx = EVP_PKEY_CTX_new(pkey, e); - if (ctx == NULL) - goto err; - if (EVP_PKEY_keygen_init(ctx) <= 0) - goto err; - EVP_PKEY_free(pkey); - *pctx = ctx; - return 1; - - err: - BIO_puts(bio_err, "Error initializing context\n"); - ERR_print_errors(bio_err); - EVP_PKEY_CTX_free(ctx); - EVP_PKEY_free(pkey); - return 0; - -} - -int init_gen_str(EVP_PKEY_CTX **pctx, - const char *algname, ENGINE *e, int do_param) -{ - EVP_PKEY_CTX *ctx = NULL; - const EVP_PKEY_ASN1_METHOD *ameth; - ENGINE *tmpeng = NULL; - int pkey_id; - - if (*pctx) { - BIO_puts(bio_err, "Algorithm already set!\n"); - return 0; - } - - ameth = EVP_PKEY_asn1_find_str(&tmpeng, algname, -1); - -#ifndef OPENSSL_NO_ENGINE - if (!ameth && e) - ameth = ENGINE_get_pkey_asn1_meth_str(e, algname, -1); -#endif - - if (!ameth) { - BIO_printf(bio_err, "Algorithm %s not found\n", algname); - return 0; - } - - ERR_clear_error(); - - EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth); -#ifndef OPENSSL_NO_ENGINE - ENGINE_finish(tmpeng); -#endif - ctx = EVP_PKEY_CTX_new_id(pkey_id, e); - - if (!ctx) - goto err; - if (do_param) { - if (EVP_PKEY_paramgen_init(ctx) <= 0) - goto err; - } else { - if (EVP_PKEY_keygen_init(ctx) <= 0) - goto err; - } - - *pctx = ctx; - return 1; - - err: - BIO_printf(bio_err, "Error initializing %s context\n", algname); - ERR_print_errors(bio_err); - EVP_PKEY_CTX_free(ctx); - return 0; - -} - -static int genpkey_cb(EVP_PKEY_CTX *ctx) -{ - char c = '*'; - BIO *b = EVP_PKEY_CTX_get_app_data(ctx); - int p; - p = EVP_PKEY_CTX_get_keygen_info(ctx, 0); - if (p == 0) - c = '.'; - if (p == 1) - c = '+'; - if (p == 2) - c = '*'; - if (p == 3) - c = '\n'; - BIO_write(b, &c, 1); - (void)BIO_flush(b); - return 1; -} diff --git a/contrib/libs/openssl/apps/genrsa.c b/contrib/libs/openssl/apps/genrsa.c deleted file mode 100644 index e34a2f7ab9..0000000000 --- a/contrib/libs/openssl/apps/genrsa.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/rsa.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/rand.h> - -#define DEFBITS 2048 -#define DEFPRIMES 2 - -static int genrsa_cb(int p, int n, BN_GENCB *cb); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_3, OPT_F4, OPT_ENGINE, - OPT_OUT, OPT_PASSOUT, OPT_CIPHER, OPT_PRIMES, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS genrsa_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"3", OPT_3, '-', "Use 3 for the E value"}, - {"F4", OPT_F4, '-', "Use F4 (0x10001) for the E value"}, - {"f4", OPT_F4, '-', "Use F4 (0x10001) for the E value"}, - {"out", OPT_OUT, '>', "Output the key to specified file"}, - OPT_R_OPTIONS, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"", OPT_CIPHER, '-', "Encrypt the output with any supported cipher"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"primes", OPT_PRIMES, 'p', "Specify number of primes"}, - {NULL} -}; - -int genrsa_main(int argc, char **argv) -{ - BN_GENCB *cb = BN_GENCB_new(); - PW_CB_DATA cb_data; - ENGINE *eng = NULL; - BIGNUM *bn = BN_new(); - BIO *out = NULL; - const BIGNUM *e; - RSA *rsa = NULL; - const EVP_CIPHER *enc = NULL; - int ret = 1, num = DEFBITS, private = 0, primes = DEFPRIMES; - unsigned long f4 = RSA_F4; - char *outfile = NULL, *passoutarg = NULL, *passout = NULL; - char *prog, *hexe, *dece; - OPTION_CHOICE o; - - if (bn == NULL || cb == NULL) - goto end; - - BN_GENCB_set(cb, genrsa_cb, bio_err); - - prog = opt_init(argc, argv, genrsa_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: -opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - ret = 0; - opt_help(genrsa_options); - goto end; - case OPT_3: - f4 = 3; - break; - case OPT_F4: - f4 = RSA_F4; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - eng = setup_engine(opt_arg(), 0); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &enc)) - goto end; - break; - case OPT_PRIMES: - if (!opt_int(opt_arg(), &primes)) - goto end; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (argc == 1) { - if (!opt_int(argv[0], &num) || num <= 0) - goto end; - if (num > OPENSSL_RSA_MAX_MODULUS_BITS) - BIO_printf(bio_err, - "Warning: It is not recommended to use more than %d bit for RSA keys.\n" - " Your key size is %d! Larger key size may behave not as expected.\n", - OPENSSL_RSA_MAX_MODULUS_BITS, num); - } else if (argc > 0) { - BIO_printf(bio_err, "Extra arguments given.\n"); - goto opthelp; - } - - private = 1; - if (!app_passwd(NULL, passoutarg, NULL, &passout)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - out = bio_open_owner(outfile, FORMAT_PEM, private); - if (out == NULL) - goto end; - - BIO_printf(bio_err, "Generating RSA private key, %d bit long modulus (%d primes)\n", - num, primes); - rsa = eng ? RSA_new_method(eng) : RSA_new(); - if (rsa == NULL) - goto end; - - if (!BN_set_word(bn, f4) - || !RSA_generate_multi_prime_key(rsa, num, primes, bn, cb)) - goto end; - - RSA_get0_key(rsa, NULL, &e, NULL); - hexe = BN_bn2hex(e); - dece = BN_bn2dec(e); - if (hexe && dece) { - BIO_printf(bio_err, "e is %s (0x%s)\n", dece, hexe); - } - OPENSSL_free(hexe); - OPENSSL_free(dece); - cb_data.password = passout; - cb_data.prompt_info = outfile; - assert(private); - if (!PEM_write_bio_RSAPrivateKey(out, rsa, enc, NULL, 0, - (pem_password_cb *)password_callback, - &cb_data)) - goto end; - - ret = 0; - end: - BN_free(bn); - BN_GENCB_free(cb); - RSA_free(rsa); - BIO_free_all(out); - release_engine(eng); - OPENSSL_free(passout); - if (ret != 0) - ERR_print_errors(bio_err); - return ret; -} - -static int genrsa_cb(int p, int n, BN_GENCB *cb) -{ - char c = '*'; - - if (p == 0) - c = '.'; - if (p == 1) - c = '+'; - if (p == 2) - c = '*'; - if (p == 3) - c = '\n'; - BIO_write(BN_GENCB_get_arg(cb), &c, 1); - (void)BIO_flush(BN_GENCB_get_arg(cb)); - return 1; -} diff --git a/contrib/libs/openssl/apps/nseq.c b/contrib/libs/openssl/apps/nseq.c deleted file mode 100644 index a067c91592..0000000000 --- a/contrib/libs/openssl/apps/nseq.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/pem.h> -#include <openssl/err.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_TOSEQ, OPT_IN, OPT_OUT -} OPTION_CHOICE; - -const OPTIONS nseq_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"toseq", OPT_TOSEQ, '-', "Output NS Sequence file"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {NULL} -}; - -int nseq_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - X509 *x509 = NULL; - NETSCAPE_CERT_SEQUENCE *seq = NULL; - OPTION_CHOICE o; - int toseq = 0, ret = 1, i; - char *infile = NULL, *outfile = NULL, *prog; - - prog = opt_init(argc, argv, nseq_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - ret = 0; - opt_help(nseq_options); - goto end; - case OPT_TOSEQ: - toseq = 1; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - in = bio_open_default(infile, 'r', FORMAT_PEM); - if (in == NULL) - goto end; - out = bio_open_default(outfile, 'w', FORMAT_PEM); - if (out == NULL) - goto end; - - if (toseq) { - seq = NETSCAPE_CERT_SEQUENCE_new(); - if (seq == NULL) - goto end; - seq->certs = sk_X509_new_null(); - if (seq->certs == NULL) - goto end; - while ((x509 = PEM_read_bio_X509(in, NULL, NULL, NULL))) - sk_X509_push(seq->certs, x509); - - if (!sk_X509_num(seq->certs)) { - BIO_printf(bio_err, "%s: Error reading certs file %s\n", - prog, infile); - ERR_print_errors(bio_err); - goto end; - } - PEM_write_bio_NETSCAPE_CERT_SEQUENCE(out, seq); - ret = 0; - goto end; - } - - seq = PEM_read_bio_NETSCAPE_CERT_SEQUENCE(in, NULL, NULL, NULL); - if (seq == NULL) { - BIO_printf(bio_err, "%s: Error reading sequence file %s\n", - prog, infile); - ERR_print_errors(bio_err); - goto end; - } - - for (i = 0; i < sk_X509_num(seq->certs); i++) { - x509 = sk_X509_value(seq->certs, i); - dump_cert_text(out, x509); - PEM_write_bio_X509(out, x509); - } - ret = 0; - end: - BIO_free(in); - BIO_free_all(out); - NETSCAPE_CERT_SEQUENCE_free(seq); - - return ret; -} diff --git a/contrib/libs/openssl/apps/ocsp.c b/contrib/libs/openssl/apps/ocsp.c deleted file mode 100644 index 27ec94fa6b..0000000000 --- a/contrib/libs/openssl/apps/ocsp.c +++ /dev/null @@ -1,1623 +0,0 @@ -/* - * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> - -#ifdef OPENSSL_SYS_VMS -# define _XOPEN_SOURCE_EXTENDED/* So fd_set and friends get properly defined - * on OpenVMS */ -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <ctype.h> - -/* Needs to be included before the openssl headers */ -#include "apps.h" -#include "progs.h" -#include "internal/sockets.h" -#include <openssl/e_os2.h> -#include <openssl/crypto.h> -#include <openssl/err.h> -#include <openssl/ssl.h> -#include <openssl/evp.h> -#include <openssl/bn.h> -#include <openssl/x509v3.h> -#include <openssl/rand.h> - -#ifndef HAVE_FORK -#if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) -# define HAVE_FORK 0 -#else -# define HAVE_FORK 1 -#endif -#endif - -#if HAVE_FORK -#undef NO_FORK -#else -#define NO_FORK -#endif - -#if !defined(NO_FORK) && !defined(OPENSSL_NO_SOCK) \ - && !defined(OPENSSL_NO_POSIX_IO) -# define OCSP_DAEMON -# include <sys/types.h> -# include <sys/wait.h> -# include <syslog.h> -# include <signal.h> -# define MAXERRLEN 1000 /* limit error text sent to syslog to 1000 bytes */ -#else -# undef LOG_INFO -# undef LOG_WARNING -# undef LOG_ERR -# define LOG_INFO 0 -# define LOG_WARNING 1 -# define LOG_ERR 2 -#endif - -#if defined(OPENSSL_SYS_VXWORKS) -/* not supported */ -int setpgid(pid_t pid, pid_t pgid) -{ - errno = ENOSYS; - return 0; -} -/* not supported */ -pid_t fork(void) -{ - errno = ENOSYS; - return (pid_t) -1; -} -#endif -/* Maximum leeway in validity period: default 5 minutes */ -#define MAX_VALIDITY_PERIOD (5 * 60) - -static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, - const EVP_MD *cert_id_md, X509 *issuer, - STACK_OF(OCSP_CERTID) *ids); -static int add_ocsp_serial(OCSP_REQUEST **req, char *serial, - const EVP_MD *cert_id_md, X509 *issuer, - STACK_OF(OCSP_CERTID) *ids); -static void print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req, - STACK_OF(OPENSSL_STRING) *names, - STACK_OF(OCSP_CERTID) *ids, long nsec, - long maxage); -static void make_ocsp_response(BIO *err, OCSP_RESPONSE **resp, OCSP_REQUEST *req, - CA_DB *db, STACK_OF(X509) *ca, X509 *rcert, - EVP_PKEY *rkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(X509) *rother, unsigned long flags, - int nmin, int ndays, int badsig); - -static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser); -static BIO *init_responder(const char *port); -static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, int timeout); -static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp); -static void log_message(int level, const char *fmt, ...); -static char *prog; -static int multi = 0; - -#ifdef OCSP_DAEMON -static int acfd = (int) INVALID_SOCKET; -static int index_changed(CA_DB *); -static void spawn_loop(void); -static int print_syslog(const char *str, size_t len, void *levPtr); -static void socket_timeout(int signum); -#endif - -#ifndef OPENSSL_NO_SOCK -static OCSP_RESPONSE *query_responder(BIO *cbio, const char *host, - const char *path, - const STACK_OF(CONF_VALUE) *headers, - OCSP_REQUEST *req, int req_timeout); -#endif - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_OUTFILE, OPT_TIMEOUT, OPT_URL, OPT_HOST, OPT_PORT, - OPT_IGNORE_ERR, OPT_NOVERIFY, OPT_NONCE, OPT_NO_NONCE, - OPT_RESP_NO_CERTS, OPT_RESP_KEY_ID, OPT_NO_CERTS, - OPT_NO_SIGNATURE_VERIFY, OPT_NO_CERT_VERIFY, OPT_NO_CHAIN, - OPT_NO_CERT_CHECKS, OPT_NO_EXPLICIT, OPT_TRUST_OTHER, - OPT_NO_INTERN, OPT_BADSIG, OPT_TEXT, OPT_REQ_TEXT, OPT_RESP_TEXT, - OPT_REQIN, OPT_RESPIN, OPT_SIGNER, OPT_VAFILE, OPT_SIGN_OTHER, - OPT_VERIFY_OTHER, OPT_CAFILE, OPT_CAPATH, OPT_NOCAFILE, OPT_NOCAPATH, - OPT_VALIDITY_PERIOD, OPT_STATUS_AGE, OPT_SIGNKEY, OPT_REQOUT, - OPT_RESPOUT, OPT_PATH, OPT_ISSUER, OPT_CERT, OPT_SERIAL, - OPT_INDEX, OPT_CA, OPT_NMIN, OPT_REQUEST, OPT_NDAYS, OPT_RSIGNER, - OPT_RKEY, OPT_ROTHER, OPT_RMD, OPT_RSIGOPT, OPT_HEADER, - OPT_V_ENUM, - OPT_MD, - OPT_MULTI -} OPTION_CHOICE; - -const OPTIONS ocsp_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"out", OPT_OUTFILE, '>', "Output filename"}, - {"timeout", OPT_TIMEOUT, 'p', - "Connection timeout (in seconds) to the OCSP responder"}, - {"url", OPT_URL, 's', "Responder URL"}, - {"host", OPT_HOST, 's', "TCP/IP hostname:port to connect to"}, - {"port", OPT_PORT, 'p', "Port to run responder on"}, - {"ignore_err", OPT_IGNORE_ERR, '-', - "Ignore error on OCSP request or response and continue running"}, - {"noverify", OPT_NOVERIFY, '-', "Don't verify response at all"}, - {"nonce", OPT_NONCE, '-', "Add OCSP nonce to request"}, - {"no_nonce", OPT_NO_NONCE, '-', "Don't add OCSP nonce to request"}, - {"resp_no_certs", OPT_RESP_NO_CERTS, '-', - "Don't include any certificates in response"}, - {"resp_key_id", OPT_RESP_KEY_ID, '-', - "Identify response by signing certificate key ID"}, -#ifdef OCSP_DAEMON - {"multi", OPT_MULTI, 'p', "run multiple responder processes"}, -#endif - {"no_certs", OPT_NO_CERTS, '-', - "Don't include any certificates in signed request"}, - {"no_signature_verify", OPT_NO_SIGNATURE_VERIFY, '-', - "Don't check signature on response"}, - {"no_cert_verify", OPT_NO_CERT_VERIFY, '-', - "Don't check signing certificate"}, - {"no_chain", OPT_NO_CHAIN, '-', "Don't chain verify response"}, - {"no_cert_checks", OPT_NO_CERT_CHECKS, '-', - "Don't do additional checks on signing certificate"}, - {"no_explicit", OPT_NO_EXPLICIT, '-', - "Do not explicitly check the chain, just verify the root"}, - {"trust_other", OPT_TRUST_OTHER, '-', - "Don't verify additional certificates"}, - {"no_intern", OPT_NO_INTERN, '-', - "Don't search certificates contained in response for signer"}, - {"badsig", OPT_BADSIG, '-', - "Corrupt last byte of loaded OSCP response signature (for test)"}, - {"text", OPT_TEXT, '-', "Print text form of request and response"}, - {"req_text", OPT_REQ_TEXT, '-', "Print text form of request"}, - {"resp_text", OPT_RESP_TEXT, '-', "Print text form of response"}, - {"reqin", OPT_REQIN, 's', "File with the DER-encoded request"}, - {"respin", OPT_RESPIN, 's', "File with the DER-encoded response"}, - {"signer", OPT_SIGNER, '<', "Certificate to sign OCSP request with"}, - {"VAfile", OPT_VAFILE, '<', "Validator certificates file"}, - {"sign_other", OPT_SIGN_OTHER, '<', - "Additional certificates to include in signed request"}, - {"verify_other", OPT_VERIFY_OTHER, '<', - "Additional certificates to search for signer"}, - {"CAfile", OPT_CAFILE, '<', "Trusted certificates file"}, - {"CApath", OPT_CAPATH, '<', "Trusted certificates directory"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"validity_period", OPT_VALIDITY_PERIOD, 'u', - "Maximum validity discrepancy in seconds"}, - {"status_age", OPT_STATUS_AGE, 'p', "Maximum status age in seconds"}, - {"signkey", OPT_SIGNKEY, 's', "Private key to sign OCSP request with"}, - {"reqout", OPT_REQOUT, 's', "Output file for the DER-encoded request"}, - {"respout", OPT_RESPOUT, 's', "Output file for the DER-encoded response"}, - {"path", OPT_PATH, 's', "Path to use in OCSP request"}, - {"issuer", OPT_ISSUER, '<', "Issuer certificate"}, - {"cert", OPT_CERT, '<', "Certificate to check"}, - {"serial", OPT_SERIAL, 's', "Serial number to check"}, - {"index", OPT_INDEX, '<', "Certificate status index file"}, - {"CA", OPT_CA, '<', "CA certificate"}, - {"nmin", OPT_NMIN, 'p', "Number of minutes before next update"}, - {"nrequest", OPT_REQUEST, 'p', - "Number of requests to accept (default unlimited)"}, - {"ndays", OPT_NDAYS, 'p', "Number of days before next update"}, - {"rsigner", OPT_RSIGNER, '<', - "Responder certificate to sign responses with"}, - {"rkey", OPT_RKEY, '<', "Responder key to sign responses with"}, - {"rother", OPT_ROTHER, '<', "Other certificates to include in response"}, - {"rmd", OPT_RMD, 's', "Digest Algorithm to use in signature of OCSP response"}, - {"rsigopt", OPT_RSIGOPT, 's', "OCSP response signature parameter in n:v form"}, - {"header", OPT_HEADER, 's', "key=value header to add"}, - {"", OPT_MD, '-', "Any supported digest algorithm (sha1,sha256, ... )"}, - OPT_V_OPTIONS, - {NULL} -}; - -int ocsp_main(int argc, char **argv) -{ - BIO *acbio = NULL, *cbio = NULL, *derbio = NULL, *out = NULL; - const EVP_MD *cert_id_md = NULL, *rsign_md = NULL; - STACK_OF(OPENSSL_STRING) *rsign_sigopts = NULL; - int trailing_md = 0; - CA_DB *rdb = NULL; - EVP_PKEY *key = NULL, *rkey = NULL; - OCSP_BASICRESP *bs = NULL; - OCSP_REQUEST *req = NULL; - OCSP_RESPONSE *resp = NULL; - STACK_OF(CONF_VALUE) *headers = NULL; - STACK_OF(OCSP_CERTID) *ids = NULL; - STACK_OF(OPENSSL_STRING) *reqnames = NULL; - STACK_OF(X509) *sign_other = NULL, *verify_other = NULL, *rother = NULL; - STACK_OF(X509) *issuers = NULL; - X509 *issuer = NULL, *cert = NULL; - STACK_OF(X509) *rca_cert = NULL; - X509 *signer = NULL, *rsigner = NULL; - X509_STORE *store = NULL; - X509_VERIFY_PARAM *vpm = NULL; - const char *CAfile = NULL, *CApath = NULL; - char *header, *value; - char *host = NULL, *port = NULL, *path = "/", *outfile = NULL; - char *rca_filename = NULL, *reqin = NULL, *respin = NULL; - char *reqout = NULL, *respout = NULL, *ridx_filename = NULL; - char *rsignfile = NULL, *rkeyfile = NULL; - char *sign_certfile = NULL, *verify_certfile = NULL, *rcertfile = NULL; - char *signfile = NULL, *keyfile = NULL; - char *thost = NULL, *tport = NULL, *tpath = NULL; - int noCAfile = 0, noCApath = 0; - int accept_count = -1, add_nonce = 1, noverify = 0, use_ssl = -1; - int vpmtouched = 0, badsig = 0, i, ignore_err = 0, nmin = 0, ndays = -1; - int req_text = 0, resp_text = 0, ret = 1; - int req_timeout = -1; - long nsec = MAX_VALIDITY_PERIOD, maxage = -1; - unsigned long sign_flags = 0, verify_flags = 0, rflags = 0; - OPTION_CHOICE o; - - reqnames = sk_OPENSSL_STRING_new_null(); - if (reqnames == NULL) - goto end; - ids = sk_OCSP_CERTID_new_null(); - if (ids == NULL) - goto end; - if ((vpm = X509_VERIFY_PARAM_new()) == NULL) - return 1; - - prog = opt_init(argc, argv, ocsp_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - ret = 0; - opt_help(ocsp_options); - goto end; - case OPT_OUTFILE: - outfile = opt_arg(); - break; - case OPT_TIMEOUT: -#ifndef OPENSSL_NO_SOCK - req_timeout = atoi(opt_arg()); -#endif - break; - case OPT_URL: - OPENSSL_free(thost); - OPENSSL_free(tport); - OPENSSL_free(tpath); - thost = tport = tpath = NULL; - if (!OCSP_parse_url(opt_arg(), &host, &port, &path, &use_ssl)) { - BIO_printf(bio_err, "%s Error parsing URL\n", prog); - goto end; - } - thost = host; - tport = port; - tpath = path; - break; - case OPT_HOST: - host = opt_arg(); - break; - case OPT_PORT: - port = opt_arg(); - break; - case OPT_IGNORE_ERR: - ignore_err = 1; - break; - case OPT_NOVERIFY: - noverify = 1; - break; - case OPT_NONCE: - add_nonce = 2; - break; - case OPT_NO_NONCE: - add_nonce = 0; - break; - case OPT_RESP_NO_CERTS: - rflags |= OCSP_NOCERTS; - break; - case OPT_RESP_KEY_ID: - rflags |= OCSP_RESPID_KEY; - break; - case OPT_NO_CERTS: - sign_flags |= OCSP_NOCERTS; - break; - case OPT_NO_SIGNATURE_VERIFY: - verify_flags |= OCSP_NOSIGS; - break; - case OPT_NO_CERT_VERIFY: - verify_flags |= OCSP_NOVERIFY; - break; - case OPT_NO_CHAIN: - verify_flags |= OCSP_NOCHAIN; - break; - case OPT_NO_CERT_CHECKS: - verify_flags |= OCSP_NOCHECKS; - break; - case OPT_NO_EXPLICIT: - verify_flags |= OCSP_NOEXPLICIT; - break; - case OPT_TRUST_OTHER: - verify_flags |= OCSP_TRUSTOTHER; - break; - case OPT_NO_INTERN: - verify_flags |= OCSP_NOINTERN; - break; - case OPT_BADSIG: - badsig = 1; - break; - case OPT_TEXT: - req_text = resp_text = 1; - break; - case OPT_REQ_TEXT: - req_text = 1; - break; - case OPT_RESP_TEXT: - resp_text = 1; - break; - case OPT_REQIN: - reqin = opt_arg(); - break; - case OPT_RESPIN: - respin = opt_arg(); - break; - case OPT_SIGNER: - signfile = opt_arg(); - break; - case OPT_VAFILE: - verify_certfile = opt_arg(); - verify_flags |= OCSP_TRUSTOTHER; - break; - case OPT_SIGN_OTHER: - sign_certfile = opt_arg(); - break; - case OPT_VERIFY_OTHER: - verify_certfile = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto end; - vpmtouched++; - break; - case OPT_VALIDITY_PERIOD: - opt_long(opt_arg(), &nsec); - break; - case OPT_STATUS_AGE: - opt_long(opt_arg(), &maxage); - break; - case OPT_SIGNKEY: - keyfile = opt_arg(); - break; - case OPT_REQOUT: - reqout = opt_arg(); - break; - case OPT_RESPOUT: - respout = opt_arg(); - break; - case OPT_PATH: - path = opt_arg(); - break; - case OPT_ISSUER: - issuer = load_cert(opt_arg(), FORMAT_PEM, "issuer certificate"); - if (issuer == NULL) - goto end; - if (issuers == NULL) { - if ((issuers = sk_X509_new_null()) == NULL) - goto end; - } - sk_X509_push(issuers, issuer); - break; - case OPT_CERT: - X509_free(cert); - cert = load_cert(opt_arg(), FORMAT_PEM, "certificate"); - if (cert == NULL) - goto end; - if (cert_id_md == NULL) - cert_id_md = EVP_sha1(); - if (!add_ocsp_cert(&req, cert, cert_id_md, issuer, ids)) - goto end; - if (!sk_OPENSSL_STRING_push(reqnames, opt_arg())) - goto end; - trailing_md = 0; - break; - case OPT_SERIAL: - if (cert_id_md == NULL) - cert_id_md = EVP_sha1(); - if (!add_ocsp_serial(&req, opt_arg(), cert_id_md, issuer, ids)) - goto end; - if (!sk_OPENSSL_STRING_push(reqnames, opt_arg())) - goto end; - trailing_md = 0; - break; - case OPT_INDEX: - ridx_filename = opt_arg(); - break; - case OPT_CA: - rca_filename = opt_arg(); - break; - case OPT_NMIN: - opt_int(opt_arg(), &nmin); - if (ndays == -1) - ndays = 0; - break; - case OPT_REQUEST: - opt_int(opt_arg(), &accept_count); - break; - case OPT_NDAYS: - ndays = atoi(opt_arg()); - break; - case OPT_RSIGNER: - rsignfile = opt_arg(); - break; - case OPT_RKEY: - rkeyfile = opt_arg(); - break; - case OPT_ROTHER: - rcertfile = opt_arg(); - break; - case OPT_RMD: /* Response MessageDigest */ - if (!opt_md(opt_arg(), &rsign_md)) - goto end; - break; - case OPT_RSIGOPT: - if (rsign_sigopts == NULL) - rsign_sigopts = sk_OPENSSL_STRING_new_null(); - if (rsign_sigopts == NULL || !sk_OPENSSL_STRING_push(rsign_sigopts, opt_arg())) - goto end; - break; - case OPT_HEADER: - header = opt_arg(); - value = strchr(header, '='); - if (value == NULL) { - BIO_printf(bio_err, "Missing = in header key=value\n"); - goto opthelp; - } - *value++ = '\0'; - if (!X509V3_add_value(header, value, &headers)) - goto end; - break; - case OPT_MD: - if (trailing_md) { - BIO_printf(bio_err, - "%s: Digest must be before -cert or -serial\n", - prog); - goto opthelp; - } - if (!opt_md(opt_unknown(), &cert_id_md)) - goto opthelp; - trailing_md = 1; - break; - case OPT_MULTI: -#ifdef OCSP_DAEMON - multi = atoi(opt_arg()); -#endif - break; - } - } - if (trailing_md) { - BIO_printf(bio_err, "%s: Digest must be before -cert or -serial\n", - prog); - goto opthelp; - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - /* Have we anything to do? */ - if (req == NULL && reqin == NULL - && respin == NULL && !(port != NULL && ridx_filename != NULL)) - goto opthelp; - - out = bio_open_default(outfile, 'w', FORMAT_TEXT); - if (out == NULL) - goto end; - - if (req == NULL && (add_nonce != 2)) - add_nonce = 0; - - if (req == NULL && reqin != NULL) { - derbio = bio_open_default(reqin, 'r', FORMAT_ASN1); - if (derbio == NULL) - goto end; - req = d2i_OCSP_REQUEST_bio(derbio, NULL); - BIO_free(derbio); - if (req == NULL) { - BIO_printf(bio_err, "Error reading OCSP request\n"); - goto end; - } - } - - if (req == NULL && port != NULL) { - acbio = init_responder(port); - if (acbio == NULL) - goto end; - } - - if (rsignfile != NULL) { - if (rkeyfile == NULL) - rkeyfile = rsignfile; - rsigner = load_cert(rsignfile, FORMAT_PEM, "responder certificate"); - if (rsigner == NULL) { - BIO_printf(bio_err, "Error loading responder certificate\n"); - goto end; - } - if (!load_certs(rca_filename, &rca_cert, FORMAT_PEM, - NULL, "CA certificate")) - goto end; - if (rcertfile != NULL) { - if (!load_certs(rcertfile, &rother, FORMAT_PEM, NULL, - "responder other certificates")) - goto end; - } - rkey = load_key(rkeyfile, FORMAT_PEM, 0, NULL, NULL, - "responder private key"); - if (rkey == NULL) - goto end; - } - - if (ridx_filename != NULL - && (rkey == NULL || rsigner == NULL || rca_cert == NULL)) { - BIO_printf(bio_err, - "Responder mode requires certificate, key, and CA.\n"); - goto end; - } - - if (ridx_filename != NULL) { - rdb = load_index(ridx_filename, NULL); - if (rdb == NULL || index_index(rdb) <= 0) { - ret = 1; - goto end; - } - } - -#ifdef OCSP_DAEMON - if (multi && acbio != NULL) - spawn_loop(); - if (acbio != NULL && req_timeout > 0) - signal(SIGALRM, socket_timeout); -#endif - - if (acbio != NULL) - log_message(LOG_INFO, "waiting for OCSP client connections..."); - -redo_accept: - - if (acbio != NULL) { -#ifdef OCSP_DAEMON - if (index_changed(rdb)) { - CA_DB *newrdb = load_index(ridx_filename, NULL); - - if (newrdb != NULL && index_index(newrdb) > 0) { - free_index(rdb); - rdb = newrdb; - } else { - free_index(newrdb); - log_message(LOG_ERR, "error reloading updated index: %s", - ridx_filename); - } - } -#endif - - req = NULL; - if (!do_responder(&req, &cbio, acbio, req_timeout)) - goto redo_accept; - - if (req == NULL) { - resp = - OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, - NULL); - send_ocsp_response(cbio, resp); - goto done_resp; - } - } - - if (req == NULL - && (signfile != NULL || reqout != NULL - || host != NULL || add_nonce || ridx_filename != NULL)) { - BIO_printf(bio_err, "Need an OCSP request for this operation!\n"); - goto end; - } - - if (req != NULL && add_nonce) { - if (!OCSP_request_add1_nonce(req, NULL, -1)) - goto end; - } - - if (signfile != NULL) { - if (keyfile == NULL) - keyfile = signfile; - signer = load_cert(signfile, FORMAT_PEM, "signer certificate"); - if (signer == NULL) { - BIO_printf(bio_err, "Error loading signer certificate\n"); - goto end; - } - if (sign_certfile != NULL) { - if (!load_certs(sign_certfile, &sign_other, FORMAT_PEM, NULL, - "signer certificates")) - goto end; - } - key = load_key(keyfile, FORMAT_PEM, 0, NULL, NULL, - "signer private key"); - if (key == NULL) - goto end; - - if (!OCSP_request_sign - (req, signer, key, NULL, sign_other, sign_flags)) { - BIO_printf(bio_err, "Error signing OCSP request\n"); - goto end; - } - } - - if (req_text && req != NULL) - OCSP_REQUEST_print(out, req, 0); - - if (reqout != NULL) { - derbio = bio_open_default(reqout, 'w', FORMAT_ASN1); - if (derbio == NULL) - goto end; - i2d_OCSP_REQUEST_bio(derbio, req); - BIO_free(derbio); - } - - if (rdb != NULL) { - make_ocsp_response(bio_err, &resp, req, rdb, rca_cert, rsigner, rkey, - rsign_md, rsign_sigopts, rother, rflags, nmin, ndays, badsig); - if (cbio != NULL) - send_ocsp_response(cbio, resp); - } else if (host != NULL) { -#ifndef OPENSSL_NO_SOCK - resp = process_responder(req, host, path, - port, use_ssl, headers, req_timeout); - if (resp == NULL) - goto end; -#else - BIO_printf(bio_err, - "Error creating connect BIO - sockets not supported.\n"); - goto end; -#endif - } else if (respin != NULL) { - derbio = bio_open_default(respin, 'r', FORMAT_ASN1); - if (derbio == NULL) - goto end; - resp = d2i_OCSP_RESPONSE_bio(derbio, NULL); - BIO_free(derbio); - if (resp == NULL) { - BIO_printf(bio_err, "Error reading OCSP response\n"); - goto end; - } - } else { - ret = 0; - goto end; - } - - done_resp: - - if (respout != NULL) { - derbio = bio_open_default(respout, 'w', FORMAT_ASN1); - if (derbio == NULL) - goto end; - i2d_OCSP_RESPONSE_bio(derbio, resp); - BIO_free(derbio); - } - - i = OCSP_response_status(resp); - if (i != OCSP_RESPONSE_STATUS_SUCCESSFUL) { - BIO_printf(out, "Responder Error: %s (%d)\n", - OCSP_response_status_str(i), i); - if (!ignore_err) - goto end; - } - - if (resp_text) - OCSP_RESPONSE_print(out, resp, 0); - - /* If running as responder don't verify our own response */ - if (cbio != NULL) { - /* If not unlimited, see if we took all we should. */ - if (accept_count != -1 && --accept_count <= 0) { - ret = 0; - goto end; - } - BIO_free_all(cbio); - cbio = NULL; - OCSP_REQUEST_free(req); - req = NULL; - OCSP_RESPONSE_free(resp); - resp = NULL; - goto redo_accept; - } - if (ridx_filename != NULL) { - ret = 0; - goto end; - } - - if (store == NULL) { - store = setup_verify(CAfile, CApath, noCAfile, noCApath); - if (!store) - goto end; - } - if (vpmtouched) - X509_STORE_set1_param(store, vpm); - if (verify_certfile != NULL) { - if (!load_certs(verify_certfile, &verify_other, FORMAT_PEM, NULL, - "validator certificate")) - goto end; - } - - bs = OCSP_response_get1_basic(resp); - if (bs == NULL) { - BIO_printf(bio_err, "Error parsing response\n"); - goto end; - } - - ret = 0; - - if (!noverify) { - if (req != NULL && ((i = OCSP_check_nonce(req, bs)) <= 0)) { - if (i == -1) - BIO_printf(bio_err, "WARNING: no nonce in response\n"); - else { - BIO_printf(bio_err, "Nonce Verify error\n"); - ret = 1; - goto end; - } - } - - i = OCSP_basic_verify(bs, verify_other, store, verify_flags); - if (i <= 0 && issuers) { - i = OCSP_basic_verify(bs, issuers, store, OCSP_TRUSTOTHER); - if (i > 0) - ERR_clear_error(); - } - if (i <= 0) { - BIO_printf(bio_err, "Response Verify Failure\n"); - ERR_print_errors(bio_err); - ret = 1; - } else { - BIO_printf(bio_err, "Response verify OK\n"); - } - } - - print_ocsp_summary(out, bs, req, reqnames, ids, nsec, maxage); - - end: - ERR_print_errors(bio_err); - X509_free(signer); - X509_STORE_free(store); - X509_VERIFY_PARAM_free(vpm); - sk_OPENSSL_STRING_free(rsign_sigopts); - EVP_PKEY_free(key); - EVP_PKEY_free(rkey); - X509_free(cert); - sk_X509_pop_free(issuers, X509_free); - X509_free(rsigner); - sk_X509_pop_free(rca_cert, X509_free); - free_index(rdb); - BIO_free_all(cbio); - BIO_free_all(acbio); - BIO_free_all(out); - OCSP_REQUEST_free(req); - OCSP_RESPONSE_free(resp); - OCSP_BASICRESP_free(bs); - sk_OPENSSL_STRING_free(reqnames); - sk_OCSP_CERTID_free(ids); - sk_X509_pop_free(sign_other, X509_free); - sk_X509_pop_free(verify_other, X509_free); - sk_CONF_VALUE_pop_free(headers, X509V3_conf_free); - OPENSSL_free(thost); - OPENSSL_free(tport); - OPENSSL_free(tpath); - - return ret; -} - -static void -log_message(int level, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); -#ifdef OCSP_DAEMON - if (multi) { - char buf[1024]; - if (vsnprintf(buf, sizeof(buf), fmt, ap) > 0) { - syslog(level, "%s", buf); - } - if (level >= LOG_ERR) - ERR_print_errors_cb(print_syslog, &level); - } -#endif - if (!multi) { - BIO_printf(bio_err, "%s: ", prog); - BIO_vprintf(bio_err, fmt, ap); - BIO_printf(bio_err, "\n"); - } - va_end(ap); -} - -#ifdef OCSP_DAEMON - -static int print_syslog(const char *str, size_t len, void *levPtr) -{ - int level = *(int *)levPtr; - int ilen = (len > MAXERRLEN) ? MAXERRLEN : len; - - syslog(level, "%.*s", ilen, str); - - return ilen; -} - -static int index_changed(CA_DB *rdb) -{ - struct stat sb; - - if (rdb != NULL && stat(rdb->dbfname, &sb) != -1) { - if (rdb->dbst.st_mtime != sb.st_mtime - || rdb->dbst.st_ctime != sb.st_ctime - || rdb->dbst.st_ino != sb.st_ino - || rdb->dbst.st_dev != sb.st_dev) { - syslog(LOG_INFO, "index file changed, reloading"); - return 1; - } - } - return 0; -} - -static void killall(int ret, pid_t *kidpids) -{ - int i; - - for (i = 0; i < multi; ++i) - if (kidpids[i] != 0) - (void)kill(kidpids[i], SIGTERM); - OPENSSL_free(kidpids); - sleep(1); - exit(ret); -} - -static int termsig = 0; - -static void noteterm (int sig) -{ - termsig = sig; -} - -/* - * Loop spawning up to `multi` child processes, only child processes return - * from this function. The parent process loops until receiving a termination - * signal, kills extant children and exits without returning. - */ -static void spawn_loop(void) -{ - pid_t *kidpids = NULL; - int status; - int procs = 0; - int i; - - openlog(prog, LOG_PID, LOG_DAEMON); - - if (setpgid(0, 0)) { - syslog(LOG_ERR, "fatal: error detaching from parent process group: %s", - strerror(errno)); - exit(1); - } - kidpids = app_malloc(multi * sizeof(*kidpids), "child PID array"); - for (i = 0; i < multi; ++i) - kidpids[i] = 0; - - signal(SIGINT, noteterm); - signal(SIGTERM, noteterm); - - while (termsig == 0) { - pid_t fpid; - - /* - * Wait for a child to replace when we're at the limit. - * Slow down if a child exited abnormally or waitpid() < 0 - */ - while (termsig == 0 && procs >= multi) { - if ((fpid = waitpid(-1, &status, 0)) > 0) { - for (i = 0; i < procs; ++i) { - if (kidpids[i] == fpid) { - kidpids[i] = 0; - --procs; - break; - } - } - if (i >= multi) { - syslog(LOG_ERR, "fatal: internal error: " - "no matching child slot for pid: %ld", - (long) fpid); - killall(1, kidpids); - } - if (status != 0) { - if (WIFEXITED(status)) - syslog(LOG_WARNING, "child process: %ld, exit status: %d", - (long)fpid, WEXITSTATUS(status)); - else if (WIFSIGNALED(status)) - syslog(LOG_WARNING, "child process: %ld, term signal %d%s", - (long)fpid, WTERMSIG(status), -#ifdef WCOREDUMP - WCOREDUMP(status) ? " (core dumped)" : -#endif - ""); - sleep(1); - } - break; - } else if (errno != EINTR) { - syslog(LOG_ERR, "fatal: waitpid(): %s", strerror(errno)); - killall(1, kidpids); - } - } - if (termsig) - break; - - switch(fpid = fork()) { - case -1: /* error */ - /* System critically low on memory, pause and try again later */ - sleep(30); - break; - case 0: /* child */ - OPENSSL_free(kidpids); - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - if (termsig) - _exit(0); - if (RAND_poll() <= 0) { - syslog(LOG_ERR, "fatal: RAND_poll() failed"); - _exit(1); - } - return; - default: /* parent */ - for (i = 0; i < multi; ++i) { - if (kidpids[i] == 0) { - kidpids[i] = fpid; - procs++; - break; - } - } - if (i >= multi) { - syslog(LOG_ERR, "fatal: internal error: no free child slots"); - killall(1, kidpids); - } - break; - } - } - - /* The loop above can only break on termsig */ - syslog(LOG_INFO, "terminating on signal: %d", termsig); - killall(0, kidpids); -} -#endif - -static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, - const EVP_MD *cert_id_md, X509 *issuer, - STACK_OF(OCSP_CERTID) *ids) -{ - OCSP_CERTID *id; - - if (issuer == NULL) { - BIO_printf(bio_err, "No issuer certificate specified\n"); - return 0; - } - if (*req == NULL) - *req = OCSP_REQUEST_new(); - if (*req == NULL) - goto err; - id = OCSP_cert_to_id(cert_id_md, cert, issuer); - if (id == NULL || !sk_OCSP_CERTID_push(ids, id)) - goto err; - if (!OCSP_request_add0_id(*req, id)) - goto err; - return 1; - - err: - BIO_printf(bio_err, "Error Creating OCSP request\n"); - return 0; -} - -static int add_ocsp_serial(OCSP_REQUEST **req, char *serial, - const EVP_MD *cert_id_md, X509 *issuer, - STACK_OF(OCSP_CERTID) *ids) -{ - OCSP_CERTID *id; - X509_NAME *iname; - ASN1_BIT_STRING *ikey; - ASN1_INTEGER *sno; - - if (issuer == NULL) { - BIO_printf(bio_err, "No issuer certificate specified\n"); - return 0; - } - if (*req == NULL) - *req = OCSP_REQUEST_new(); - if (*req == NULL) - goto err; - iname = X509_get_subject_name(issuer); - ikey = X509_get0_pubkey_bitstr(issuer); - sno = s2i_ASN1_INTEGER(NULL, serial); - if (sno == NULL) { - BIO_printf(bio_err, "Error converting serial number %s\n", serial); - return 0; - } - id = OCSP_cert_id_new(cert_id_md, iname, ikey, sno); - ASN1_INTEGER_free(sno); - if (id == NULL || !sk_OCSP_CERTID_push(ids, id)) - goto err; - if (!OCSP_request_add0_id(*req, id)) - goto err; - return 1; - - err: - BIO_printf(bio_err, "Error Creating OCSP request\n"); - return 0; -} - -static void print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req, - STACK_OF(OPENSSL_STRING) *names, - STACK_OF(OCSP_CERTID) *ids, long nsec, - long maxage) -{ - OCSP_CERTID *id; - const char *name; - int i, status, reason; - ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd; - - if (bs == NULL || req == NULL || !sk_OPENSSL_STRING_num(names) - || !sk_OCSP_CERTID_num(ids)) - return; - - for (i = 0; i < sk_OCSP_CERTID_num(ids); i++) { - id = sk_OCSP_CERTID_value(ids, i); - name = sk_OPENSSL_STRING_value(names, i); - BIO_printf(out, "%s: ", name); - - if (!OCSP_resp_find_status(bs, id, &status, &reason, - &rev, &thisupd, &nextupd)) { - BIO_puts(out, "ERROR: No Status found.\n"); - continue; - } - - /* - * Check validity: if invalid write to output BIO so we know which - * response this refers to. - */ - if (!OCSP_check_validity(thisupd, nextupd, nsec, maxage)) { - BIO_puts(out, "WARNING: Status times invalid.\n"); - ERR_print_errors(out); - } - BIO_printf(out, "%s\n", OCSP_cert_status_str(status)); - - BIO_puts(out, "\tThis Update: "); - ASN1_GENERALIZEDTIME_print(out, thisupd); - BIO_puts(out, "\n"); - - if (nextupd) { - BIO_puts(out, "\tNext Update: "); - ASN1_GENERALIZEDTIME_print(out, nextupd); - BIO_puts(out, "\n"); - } - - if (status != V_OCSP_CERTSTATUS_REVOKED) - continue; - - if (reason != -1) - BIO_printf(out, "\tReason: %s\n", OCSP_crl_reason_str(reason)); - - BIO_puts(out, "\tRevocation Time: "); - ASN1_GENERALIZEDTIME_print(out, rev); - BIO_puts(out, "\n"); - } -} - -static void make_ocsp_response(BIO *err, OCSP_RESPONSE **resp, OCSP_REQUEST *req, - CA_DB *db, STACK_OF(X509) *ca, X509 *rcert, - EVP_PKEY *rkey, const EVP_MD *rmd, - STACK_OF(OPENSSL_STRING) *sigopts, - STACK_OF(X509) *rother, unsigned long flags, - int nmin, int ndays, int badsig) -{ - ASN1_TIME *thisupd = NULL, *nextupd = NULL; - OCSP_CERTID *cid; - OCSP_BASICRESP *bs = NULL; - int i, id_count; - EVP_MD_CTX *mctx = NULL; - EVP_PKEY_CTX *pkctx = NULL; - - id_count = OCSP_request_onereq_count(req); - - if (id_count <= 0) { - *resp = - OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, NULL); - goto end; - } - - bs = OCSP_BASICRESP_new(); - thisupd = X509_gmtime_adj(NULL, 0); - if (ndays != -1) - nextupd = X509_time_adj_ex(NULL, ndays, nmin * 60, NULL); - - /* Examine each certificate id in the request */ - for (i = 0; i < id_count; i++) { - OCSP_ONEREQ *one; - ASN1_INTEGER *serial; - char **inf; - int jj; - int found = 0; - ASN1_OBJECT *cert_id_md_oid; - const EVP_MD *cert_id_md; - one = OCSP_request_onereq_get0(req, i); - cid = OCSP_onereq_get0_id(one); - - OCSP_id_get0_info(NULL, &cert_id_md_oid, NULL, NULL, cid); - - cert_id_md = EVP_get_digestbyobj(cert_id_md_oid); - if (cert_id_md == NULL) { - *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR, - NULL); - goto end; - } - for (jj = 0; jj < sk_X509_num(ca) && !found; jj++) { - X509 *ca_cert = sk_X509_value(ca, jj); - OCSP_CERTID *ca_id = OCSP_cert_to_id(cert_id_md, NULL, ca_cert); - - if (OCSP_id_issuer_cmp(ca_id, cid) == 0) - found = 1; - - OCSP_CERTID_free(ca_id); - } - - if (!found) { - OCSP_basic_add1_status(bs, cid, - V_OCSP_CERTSTATUS_UNKNOWN, - 0, NULL, thisupd, nextupd); - continue; - } - OCSP_id_get0_info(NULL, NULL, NULL, &serial, cid); - inf = lookup_serial(db, serial); - if (inf == NULL) { - OCSP_basic_add1_status(bs, cid, - V_OCSP_CERTSTATUS_UNKNOWN, - 0, NULL, thisupd, nextupd); - } else if (inf[DB_type][0] == DB_TYPE_VAL) { - OCSP_basic_add1_status(bs, cid, - V_OCSP_CERTSTATUS_GOOD, - 0, NULL, thisupd, nextupd); - } else if (inf[DB_type][0] == DB_TYPE_REV) { - ASN1_OBJECT *inst = NULL; - ASN1_TIME *revtm = NULL; - ASN1_GENERALIZEDTIME *invtm = NULL; - OCSP_SINGLERESP *single; - int reason = -1; - unpack_revinfo(&revtm, &reason, &inst, &invtm, inf[DB_rev_date]); - single = OCSP_basic_add1_status(bs, cid, - V_OCSP_CERTSTATUS_REVOKED, - reason, revtm, thisupd, nextupd); - if (invtm != NULL) - OCSP_SINGLERESP_add1_ext_i2d(single, NID_invalidity_date, - invtm, 0, 0); - else if (inst != NULL) - OCSP_SINGLERESP_add1_ext_i2d(single, - NID_hold_instruction_code, inst, - 0, 0); - ASN1_OBJECT_free(inst); - ASN1_TIME_free(revtm); - ASN1_GENERALIZEDTIME_free(invtm); - } - } - - OCSP_copy_nonce(bs, req); - - mctx = EVP_MD_CTX_new(); - if ( mctx == NULL || !EVP_DigestSignInit(mctx, &pkctx, rmd, NULL, rkey)) { - *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR, NULL); - goto end; - } - for (i = 0; i < sk_OPENSSL_STRING_num(sigopts); i++) { - char *sigopt = sk_OPENSSL_STRING_value(sigopts, i); - - if (pkey_ctrl_string(pkctx, sigopt) <= 0) { - BIO_printf(err, "parameter error \"%s\"\n", sigopt); - ERR_print_errors(bio_err); - *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR, - NULL); - goto end; - } - } - if (!OCSP_basic_sign_ctx(bs, rcert, mctx, rother, flags)) { - *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR, bs); - goto end; - } - - if (badsig) { - const ASN1_OCTET_STRING *sig = OCSP_resp_get0_signature(bs); - corrupt_signature(sig); - } - - *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_SUCCESSFUL, bs); - - end: - EVP_MD_CTX_free(mctx); - ASN1_TIME_free(thisupd); - ASN1_TIME_free(nextupd); - OCSP_BASICRESP_free(bs); -} - -static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser) -{ - int i; - BIGNUM *bn = NULL; - char *itmp, *row[DB_NUMBER], **rrow; - for (i = 0; i < DB_NUMBER; i++) - row[i] = NULL; - bn = ASN1_INTEGER_to_BN(ser, NULL); - OPENSSL_assert(bn); /* FIXME: should report an error at this - * point and abort */ - if (BN_is_zero(bn)) - itmp = OPENSSL_strdup("00"); - else - itmp = BN_bn2hex(bn); - row[DB_serial] = itmp; - BN_free(bn); - rrow = TXT_DB_get_by_index(db->db, DB_serial, row); - OPENSSL_free(itmp); - return rrow; -} - -/* Quick and dirty OCSP server: read in and parse input request */ - -static BIO *init_responder(const char *port) -{ -#ifdef OPENSSL_NO_SOCK - BIO_printf(bio_err, - "Error setting up accept BIO - sockets not supported.\n"); - return NULL; -#else - BIO *acbio = NULL, *bufbio = NULL; - - bufbio = BIO_new(BIO_f_buffer()); - if (bufbio == NULL) - goto err; - acbio = BIO_new(BIO_s_accept()); - if (acbio == NULL - || BIO_set_bind_mode(acbio, BIO_BIND_REUSEADDR) < 0 - || BIO_set_accept_port(acbio, port) < 0) { - log_message(LOG_ERR, "Error setting up accept BIO"); - goto err; - } - - BIO_set_accept_bios(acbio, bufbio); - bufbio = NULL; - if (BIO_do_accept(acbio) <= 0) { - log_message(LOG_ERR, "Error starting accept"); - goto err; - } - - return acbio; - - err: - BIO_free_all(acbio); - BIO_free(bufbio); - return NULL; -#endif -} - -#ifndef OPENSSL_NO_SOCK -/* - * Decode %xx URL-decoding in-place. Ignores mal-formed sequences. - */ -static int urldecode(char *p) -{ - unsigned char *out = (unsigned char *)p; - unsigned char *save = out; - - for (; *p; p++) { - if (*p != '%') - *out++ = *p; - else if (isxdigit(_UC(p[1])) && isxdigit(_UC(p[2]))) { - /* Don't check, can't fail because of ixdigit() call. */ - *out++ = (OPENSSL_hexchar2int(p[1]) << 4) - | OPENSSL_hexchar2int(p[2]); - p += 2; - } - else - return -1; - } - *out = '\0'; - return (int)(out - save); -} -#endif - -#ifdef OCSP_DAEMON -static void socket_timeout(int signum) -{ - if (acfd != (int)INVALID_SOCKET) - (void)shutdown(acfd, SHUT_RD); -} -#endif - -static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, - int timeout) -{ -#ifdef OPENSSL_NO_SOCK - return 0; -#else - int len; - OCSP_REQUEST *req = NULL; - char inbuf[2048], reqbuf[2048]; - char *p, *q; - BIO *cbio = NULL, *getbio = NULL, *b64 = NULL; - const char *client; - - *preq = NULL; - - /* Connection loss before accept() is routine, ignore silently */ - if (BIO_do_accept(acbio) <= 0) - return 0; - - cbio = BIO_pop(acbio); - *pcbio = cbio; - client = BIO_get_peer_name(cbio); - -# ifdef OCSP_DAEMON - if (timeout > 0) { - (void) BIO_get_fd(cbio, &acfd); - alarm(timeout); - } -# endif - - /* Read the request line. */ - len = BIO_gets(cbio, reqbuf, sizeof(reqbuf)); - if (len <= 0) - goto out; - - if (strncmp(reqbuf, "GET ", 4) == 0) { - /* Expecting GET {sp} /URL {sp} HTTP/1.x */ - for (p = reqbuf + 4; *p == ' '; ++p) - continue; - if (*p != '/') { - log_message(LOG_INFO, "Invalid request -- bad URL: %s", client); - goto out; - } - p++; - - /* Splice off the HTTP version identifier. */ - for (q = p; *q; q++) - if (*q == ' ') - break; - if (strncmp(q, " HTTP/1.", 8) != 0) { - log_message(LOG_INFO, - "Invalid request -- bad HTTP version: %s", client); - goto out; - } - *q = '\0'; - - /* - * Skip "GET / HTTP..." requests often used by load-balancers. Note: - * 'p' was incremented above to point to the first byte *after* the - * leading slash, so with 'GET / ' it is now an empty string. - */ - if (p[0] == '\0') - goto out; - - len = urldecode(p); - if (len <= 0) { - log_message(LOG_INFO, - "Invalid request -- bad URL encoding: %s", client); - goto out; - } - if ((getbio = BIO_new_mem_buf(p, len)) == NULL - || (b64 = BIO_new(BIO_f_base64())) == NULL) { - log_message(LOG_ERR, "Could not allocate base64 bio: %s", client); - goto out; - } - BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - getbio = BIO_push(b64, getbio); - } else if (strncmp(reqbuf, "POST ", 5) != 0) { - log_message(LOG_INFO, "Invalid request -- bad HTTP verb: %s", client); - goto out; - } - - /* Read and skip past the headers. */ - for (;;) { - len = BIO_gets(cbio, inbuf, sizeof(inbuf)); - if (len <= 0) - goto out; - if ((inbuf[0] == '\r') || (inbuf[0] == '\n')) - break; - } - -# ifdef OCSP_DAEMON - /* Clear alarm before we close the client socket */ - alarm(0); - timeout = 0; -# endif - - /* Try to read OCSP request */ - if (getbio != NULL) { - req = d2i_OCSP_REQUEST_bio(getbio, NULL); - BIO_free_all(getbio); - } else { - req = d2i_OCSP_REQUEST_bio(cbio, NULL); - } - - if (req == NULL) - log_message(LOG_ERR, "Error parsing OCSP request"); - - *preq = req; - -out: -# ifdef OCSP_DAEMON - if (timeout > 0) - alarm(0); - acfd = (int)INVALID_SOCKET; -# endif - return 1; -#endif -} - -static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp) -{ - char http_resp[] = - "HTTP/1.0 200 OK\r\nContent-type: application/ocsp-response\r\n" - "Content-Length: %d\r\n\r\n"; - if (cbio == NULL) - return 0; - BIO_printf(cbio, http_resp, i2d_OCSP_RESPONSE(resp, NULL)); - i2d_OCSP_RESPONSE_bio(cbio, resp); - (void)BIO_flush(cbio); - return 1; -} - -#ifndef OPENSSL_NO_SOCK -static OCSP_RESPONSE *query_responder(BIO *cbio, const char *host, - const char *path, - const STACK_OF(CONF_VALUE) *headers, - OCSP_REQUEST *req, int req_timeout) -{ - int fd; - int rv; - int i; - int add_host = 1; - OCSP_REQ_CTX *ctx = NULL; - OCSP_RESPONSE *rsp = NULL; - fd_set confds; - struct timeval tv; - - if (req_timeout != -1) - BIO_set_nbio(cbio, 1); - - rv = BIO_do_connect(cbio); - - if ((rv <= 0) && ((req_timeout == -1) || !BIO_should_retry(cbio))) { - BIO_puts(bio_err, "Error connecting BIO\n"); - return NULL; - } - - if (BIO_get_fd(cbio, &fd) < 0) { - BIO_puts(bio_err, "Can't get connection fd\n"); - goto err; - } - - if (req_timeout != -1 && rv <= 0) { - FD_ZERO(&confds); - openssl_fdset(fd, &confds); - tv.tv_usec = 0; - tv.tv_sec = req_timeout; - rv = select(fd + 1, NULL, (void *)&confds, NULL, &tv); - if (rv == 0) { - BIO_puts(bio_err, "Timeout on connect\n"); - return NULL; - } - } - - ctx = OCSP_sendreq_new(cbio, path, NULL, -1); - if (ctx == NULL) - return NULL; - - for (i = 0; i < sk_CONF_VALUE_num(headers); i++) { - CONF_VALUE *hdr = sk_CONF_VALUE_value(headers, i); - if (add_host == 1 && strcasecmp("host", hdr->name) == 0) - add_host = 0; - if (!OCSP_REQ_CTX_add1_header(ctx, hdr->name, hdr->value)) - goto err; - } - - if (add_host == 1 && OCSP_REQ_CTX_add1_header(ctx, "Host", host) == 0) - goto err; - - if (!OCSP_REQ_CTX_set1_req(ctx, req)) - goto err; - - for (;;) { - rv = OCSP_sendreq_nbio(&rsp, ctx); - if (rv != -1) - break; - if (req_timeout == -1) - continue; - FD_ZERO(&confds); - openssl_fdset(fd, &confds); - tv.tv_usec = 0; - tv.tv_sec = req_timeout; - if (BIO_should_read(cbio)) { - rv = select(fd + 1, (void *)&confds, NULL, NULL, &tv); - } else if (BIO_should_write(cbio)) { - rv = select(fd + 1, NULL, (void *)&confds, NULL, &tv); - } else { - BIO_puts(bio_err, "Unexpected retry condition\n"); - goto err; - } - if (rv == 0) { - BIO_puts(bio_err, "Timeout on request\n"); - break; - } - if (rv == -1) { - BIO_puts(bio_err, "Select error\n"); - break; - } - - } - err: - OCSP_REQ_CTX_free(ctx); - - return rsp; -} - -OCSP_RESPONSE *process_responder(OCSP_REQUEST *req, - const char *host, const char *path, - const char *port, int use_ssl, - STACK_OF(CONF_VALUE) *headers, - int req_timeout) -{ - BIO *cbio = NULL; - SSL_CTX *ctx = NULL; - OCSP_RESPONSE *resp = NULL; - - cbio = BIO_new_connect(host); - if (cbio == NULL) { - BIO_printf(bio_err, "Error creating connect BIO\n"); - goto end; - } - if (port != NULL) - BIO_set_conn_port(cbio, port); - if (use_ssl == 1) { - BIO *sbio; - ctx = SSL_CTX_new(TLS_client_method()); - if (ctx == NULL) { - BIO_printf(bio_err, "Error creating SSL context.\n"); - goto end; - } - SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); - sbio = BIO_new_ssl(ctx, 1); - cbio = BIO_push(sbio, cbio); - } - - resp = query_responder(cbio, host, path, headers, req, req_timeout); - if (resp == NULL) - BIO_printf(bio_err, "Error querying OCSP responder\n"); - end: - BIO_free_all(cbio); - SSL_CTX_free(ctx); - return resp; -} -#endif diff --git a/contrib/libs/openssl/apps/openssl.c b/contrib/libs/openssl/apps/openssl.c deleted file mode 100644 index ff7b759a40..0000000000 --- a/contrib/libs/openssl/apps/openssl.c +++ /dev/null @@ -1,832 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <internal/cryptlib.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <openssl/bio.h> -#include <openssl/crypto.h> -#include <openssl/lhash.h> -#include <openssl/conf.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/ssl.h> -#ifndef OPENSSL_NO_ENGINE -# include <openssl/engine.h> -#endif -#include <openssl/err.h> -/* Needed to get the other O_xxx flags. */ -#ifdef OPENSSL_SYS_VMS -# include <unixio.h> -#endif -#include "apps.h" -#define INCLUDE_FUNCTION_TABLE -#include "progs.h" - -/* Structure to hold the number of columns to be displayed and the - * field width used to display them. - */ -typedef struct { - int columns; - int width; -} DISPLAY_COLUMNS; - -/* Special sentinel to exit the program. */ -#define EXIT_THE_PROGRAM (-1) - -/* - * The LHASH callbacks ("hash" & "cmp") have been replaced by functions with - * the base prototypes (we cast each variable inside the function to the - * required type of "FUNCTION*"). This removes the necessity for - * macro-generated wrapper functions. - */ -static LHASH_OF(FUNCTION) *prog_init(void); -static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[]); -static void list_pkey(void); -static void list_pkey_meth(void); -static void list_type(FUNC_TYPE ft, int one); -static void list_disabled(void); -char *default_config_file = NULL; - -BIO *bio_in = NULL; -BIO *bio_out = NULL; -BIO *bio_err = NULL; - -static void calculate_columns(DISPLAY_COLUMNS *dc) -{ - FUNCTION *f; - int len, maxlen = 0; - - for (f = functions; f->name != NULL; ++f) - if (f->type == FT_general || f->type == FT_md || f->type == FT_cipher) - if ((len = strlen(f->name)) > maxlen) - maxlen = len; - - dc->width = maxlen + 2; - dc->columns = (80 - 1) / dc->width; -} - -static int apps_startup(void) -{ -#ifdef SIGPIPE - signal(SIGPIPE, SIG_IGN); -#endif - - /* Set non-default library initialisation settings */ - if (!OPENSSL_init_ssl(OPENSSL_INIT_ENGINE_ALL_BUILTIN - | OPENSSL_INIT_LOAD_CONFIG, NULL)) - return 0; - - setup_ui_method(); - - return 1; -} - -static void apps_shutdown(void) -{ - destroy_ui_method(); - destroy_prefix_method(); -} - -static char *make_config_name(void) -{ - const char *t; - size_t len; - char *p; - - if ((t = getenv("OPENSSL_CONF")) != NULL) - return OPENSSL_strdup(t); - - t = X509_get_default_cert_area(); - len = strlen(t) + 1 + strlen(OPENSSL_CONF) + 1; - p = app_malloc(len, "config filename buffer"); - strcpy(p, t); -#ifndef OPENSSL_SYS_VMS - strcat(p, "/"); -#endif - strcat(p, OPENSSL_CONF); - - return p; -} - -int main(int argc, char *argv[]) -{ - FUNCTION f, *fp; - LHASH_OF(FUNCTION) *prog = NULL; - char **copied_argv = NULL; - char *p, *pname; - char buf[1024]; - const char *prompt; - ARGS arg; - int first, n, i, ret = 0; - - arg.argv = NULL; - arg.size = 0; - - /* Set up some of the environment. */ - default_config_file = make_config_name(); - bio_in = dup_bio_in(FORMAT_TEXT); - bio_out = dup_bio_out(FORMAT_TEXT); - bio_err = dup_bio_err(FORMAT_TEXT); - -#if defined(OPENSSL_SYS_VMS) && defined(__DECC) - copied_argv = argv = copy_argv(&argc, argv); -#elif defined(_WIN32) - /* - * Replace argv[] with UTF-8 encoded strings. - */ - win32_utf8argv(&argc, &argv); -#endif - - p = getenv("OPENSSL_DEBUG_MEMORY"); - if (p != NULL && strcmp(p, "on") == 0) - CRYPTO_set_mem_debug(1); - CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); - - if (getenv("OPENSSL_FIPS")) { - BIO_printf(bio_err, "FIPS mode not supported.\n"); - return 1; - } - - if (!apps_startup()) { - BIO_printf(bio_err, - "FATAL: Startup failure (dev note: apps_startup() failed)\n"); - ERR_print_errors(bio_err); - ret = 1; - goto end; - } - - prog = prog_init(); - if (prog == NULL) { - BIO_printf(bio_err, - "FATAL: Startup failure (dev note: prog_init() failed)\n"); - ERR_print_errors(bio_err); - ret = 1; - goto end; - } - pname = opt_progname(argv[0]); - - /* first check the program name */ - f.name = pname; - fp = lh_FUNCTION_retrieve(prog, &f); - if (fp != NULL) { - argv[0] = pname; - ret = fp->func(argc, argv); - goto end; - } - - /* If there is stuff on the command line, run with that. */ - if (argc != 1) { - argc--; - argv++; - ret = do_cmd(prog, argc, argv); - if (ret < 0) - ret = 0; - goto end; - } - - /* ok, lets enter interactive mode */ - for (;;) { - ret = 0; - /* Read a line, continue reading if line ends with \ */ - for (p = buf, n = sizeof(buf), i = 0, first = 1; n > 0; first = 0) { - prompt = first ? "OpenSSL> " : "> "; - p[0] = '\0'; -#ifndef READLINE - fputs(prompt, stdout); - fflush(stdout); - if (!fgets(p, n, stdin)) - goto end; - if (p[0] == '\0') - goto end; - i = strlen(p); - if (i <= 1) - break; - if (p[i - 2] != '\\') - break; - i -= 2; - p += i; - n -= i; -#else - { - extern char *readline(const char *); - extern void add_history(const char *cp); - char *text; - - text = readline(prompt); - if (text == NULL) - goto end; - i = strlen(text); - if (i == 0 || i > n) - break; - if (text[i - 1] != '\\') { - p += strlen(strcpy(p, text)); - free(text); - add_history(buf); - break; - } - - text[i - 1] = '\0'; - p += strlen(strcpy(p, text)); - free(text); - n -= i; - } -#endif - } - - if (!chopup_args(&arg, buf)) { - BIO_printf(bio_err, "Can't parse (no memory?)\n"); - break; - } - - ret = do_cmd(prog, arg.argc, arg.argv); - if (ret == EXIT_THE_PROGRAM) { - ret = 0; - goto end; - } - if (ret != 0) - BIO_printf(bio_err, "error in %s\n", arg.argv[0]); - (void)BIO_flush(bio_out); - (void)BIO_flush(bio_err); - } - ret = 1; - end: - OPENSSL_free(copied_argv); - OPENSSL_free(default_config_file); - lh_FUNCTION_free(prog); - OPENSSL_free(arg.argv); - app_RAND_write(); - - BIO_free(bio_in); - BIO_free_all(bio_out); - apps_shutdown(); -#ifndef OPENSSL_NO_CRYPTO_MDEBUG - if (CRYPTO_mem_leaks(bio_err) <= 0) - ret = 1; -#endif - BIO_free(bio_err); - EXIT(ret); -} - -static void list_cipher_fn(const EVP_CIPHER *c, - const char *from, const char *to, void *arg) -{ - if (c != NULL) { - BIO_printf(arg, "%s\n", EVP_CIPHER_name(c)); - } else { - if (from == NULL) - from = "<undefined>"; - if (to == NULL) - to = "<undefined>"; - BIO_printf(arg, "%s => %s\n", from, to); - } -} - -static void list_md_fn(const EVP_MD *m, - const char *from, const char *to, void *arg) -{ - if (m != NULL) { - BIO_printf(arg, "%s\n", EVP_MD_name(m)); - } else { - if (from == NULL) - from = "<undefined>"; - if (to == NULL) - to = "<undefined>"; - BIO_printf((BIO *)arg, "%s => %s\n", from, to); - } -} - -static void list_missing_help(void) -{ - const FUNCTION *fp; - const OPTIONS *o; - - for (fp = functions; fp->name != NULL; fp++) { - if ((o = fp->help) != NULL) { - /* If there is help, list what flags are not documented. */ - for ( ; o->name != NULL; o++) { - if (o->helpstr == NULL) - BIO_printf(bio_out, "%s %s\n", fp->name, o->name); - } - } else if (fp->func != dgst_main) { - /* If not aliased to the dgst command, */ - BIO_printf(bio_out, "%s *\n", fp->name); - } - } -} - -static void list_options_for_command(const char *command) -{ - const FUNCTION *fp; - const OPTIONS *o; - - for (fp = functions; fp->name != NULL; fp++) - if (strcmp(fp->name, command) == 0) - break; - if (fp->name == NULL) { - BIO_printf(bio_err, "Invalid command '%s'; type \"help\" for a list.\n", - command); - return; - } - - if ((o = fp->help) == NULL) - return; - - for ( ; o->name != NULL; o++) { - if (o->name == OPT_HELP_STR - || o->name == OPT_MORE_STR - || o->name[0] == '\0') - continue; - BIO_printf(bio_out, "%s %c\n", o->name, o->valtype); - } -} - - -/* Unified enum for help and list commands. */ -typedef enum HELPLIST_CHOICE { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ONE, - OPT_COMMANDS, OPT_DIGEST_COMMANDS, OPT_OPTIONS, - OPT_DIGEST_ALGORITHMS, OPT_CIPHER_COMMANDS, OPT_CIPHER_ALGORITHMS, - OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_DISABLED, OPT_MISSING_HELP -} HELPLIST_CHOICE; - -const OPTIONS list_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"1", OPT_ONE, '-', "List in one column"}, - {"commands", OPT_COMMANDS, '-', "List of standard commands"}, - {"digest-commands", OPT_DIGEST_COMMANDS, '-', - "List of message digest commands"}, - {"digest-algorithms", OPT_DIGEST_ALGORITHMS, '-', - "List of message digest algorithms"}, - {"cipher-commands", OPT_CIPHER_COMMANDS, '-', "List of cipher commands"}, - {"cipher-algorithms", OPT_CIPHER_ALGORITHMS, '-', - "List of cipher algorithms"}, - {"public-key-algorithms", OPT_PK_ALGORITHMS, '-', - "List of public key algorithms"}, - {"public-key-methods", OPT_PK_METHOD, '-', - "List of public key methods"}, - {"disabled", OPT_DISABLED, '-', - "List of disabled features"}, - {"missing-help", OPT_MISSING_HELP, '-', - "List missing detailed help strings"}, - {"options", OPT_OPTIONS, 's', - "List options for specified command"}, - {NULL} -}; - -int list_main(int argc, char **argv) -{ - char *prog; - HELPLIST_CHOICE o; - int one = 0, done = 0; - - prog = opt_init(argc, argv, list_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: /* Never hit, but suppresses warning */ - case OPT_ERR: -opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - return 1; - case OPT_HELP: - opt_help(list_options); - break; - case OPT_ONE: - one = 1; - break; - case OPT_COMMANDS: - list_type(FT_general, one); - break; - case OPT_DIGEST_COMMANDS: - list_type(FT_md, one); - break; - case OPT_DIGEST_ALGORITHMS: - EVP_MD_do_all_sorted(list_md_fn, bio_out); - break; - case OPT_CIPHER_COMMANDS: - list_type(FT_cipher, one); - break; - case OPT_CIPHER_ALGORITHMS: - EVP_CIPHER_do_all_sorted(list_cipher_fn, bio_out); - break; - case OPT_PK_ALGORITHMS: - list_pkey(); - break; - case OPT_PK_METHOD: - list_pkey_meth(); - break; - case OPT_DISABLED: - list_disabled(); - break; - case OPT_MISSING_HELP: - list_missing_help(); - break; - case OPT_OPTIONS: - list_options_for_command(opt_arg()); - break; - } - done = 1; - } - if (opt_num_rest() != 0) { - BIO_printf(bio_err, "Extra arguments given.\n"); - goto opthelp; - } - - if (!done) - goto opthelp; - - return 0; -} - -typedef enum HELP_CHOICE { - OPT_hERR = -1, OPT_hEOF = 0, OPT_hHELP -} HELP_CHOICE; - -const OPTIONS help_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: help [options]\n"}, - {OPT_HELP_STR, 1, '-', " help [command]\n"}, - {"help", OPT_hHELP, '-', "Display this summary"}, - {NULL} -}; - - -int help_main(int argc, char **argv) -{ - FUNCTION *fp; - int i, nl; - FUNC_TYPE tp; - char *prog; - HELP_CHOICE o; - DISPLAY_COLUMNS dc; - - prog = opt_init(argc, argv, help_options); - while ((o = opt_next()) != OPT_hEOF) { - switch (o) { - case OPT_hERR: - case OPT_hEOF: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - return 1; - case OPT_hHELP: - opt_help(help_options); - return 0; - } - } - - if (opt_num_rest() == 1) { - char *new_argv[3]; - - new_argv[0] = opt_rest()[0]; - new_argv[1] = "--help"; - new_argv[2] = NULL; - return do_cmd(prog_init(), 2, new_argv); - } - if (opt_num_rest() != 0) { - BIO_printf(bio_err, "Usage: %s\n", prog); - return 1; - } - - calculate_columns(&dc); - BIO_printf(bio_err, "Standard commands"); - i = 0; - tp = FT_none; - for (fp = functions; fp->name != NULL; fp++) { - nl = 0; - if (i++ % dc.columns == 0) { - BIO_printf(bio_err, "\n"); - nl = 1; - } - if (fp->type != tp) { - tp = fp->type; - if (!nl) - BIO_printf(bio_err, "\n"); - if (tp == FT_md) { - i = 1; - BIO_printf(bio_err, - "\nMessage Digest commands (see the `dgst' command for more details)\n"); - } else if (tp == FT_cipher) { - i = 1; - BIO_printf(bio_err, - "\nCipher commands (see the `enc' command for more details)\n"); - } - } - BIO_printf(bio_err, "%-*s", dc.width, fp->name); - } - BIO_printf(bio_err, "\n\n"); - return 0; -} - -static void list_type(FUNC_TYPE ft, int one) -{ - FUNCTION *fp; - int i = 0; - DISPLAY_COLUMNS dc = {0}; - - if (!one) - calculate_columns(&dc); - - for (fp = functions; fp->name != NULL; fp++) { - if (fp->type != ft) - continue; - if (one) { - BIO_printf(bio_out, "%s\n", fp->name); - } else { - if (i % dc.columns == 0 && i > 0) - BIO_printf(bio_out, "\n"); - BIO_printf(bio_out, "%-*s", dc.width, fp->name); - i++; - } - } - if (!one) - BIO_printf(bio_out, "\n\n"); -} - -static int do_cmd(LHASH_OF(FUNCTION) *prog, int argc, char *argv[]) -{ - FUNCTION f, *fp; - - if (argc <= 0 || argv[0] == NULL) - return 0; - f.name = argv[0]; - fp = lh_FUNCTION_retrieve(prog, &f); - if (fp == NULL) { - if (EVP_get_digestbyname(argv[0])) { - f.type = FT_md; - f.func = dgst_main; - fp = &f; - } else if (EVP_get_cipherbyname(argv[0])) { - f.type = FT_cipher; - f.func = enc_main; - fp = &f; - } - } - if (fp != NULL) { - return fp->func(argc, argv); - } - if ((strncmp(argv[0], "no-", 3)) == 0) { - /* - * User is asking if foo is unsupported, by trying to "run" the - * no-foo command. Strange. - */ - f.name = argv[0] + 3; - if (lh_FUNCTION_retrieve(prog, &f) == NULL) { - BIO_printf(bio_out, "%s\n", argv[0]); - return 0; - } - BIO_printf(bio_out, "%s\n", argv[0] + 3); - return 1; - } - if (strcmp(argv[0], "quit") == 0 || strcmp(argv[0], "q") == 0 || - strcmp(argv[0], "exit") == 0 || strcmp(argv[0], "bye") == 0) - /* Special value to mean "exit the program. */ - return EXIT_THE_PROGRAM; - - BIO_printf(bio_err, "Invalid command '%s'; type \"help\" for a list.\n", - argv[0]); - return 1; -} - -static void list_pkey(void) -{ - int i; - - for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) { - const EVP_PKEY_ASN1_METHOD *ameth; - int pkey_id, pkey_base_id, pkey_flags; - const char *pinfo, *pem_str; - ameth = EVP_PKEY_asn1_get0(i); - EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags, - &pinfo, &pem_str, ameth); - if (pkey_flags & ASN1_PKEY_ALIAS) { - BIO_printf(bio_out, "Name: %s\n", OBJ_nid2ln(pkey_id)); - BIO_printf(bio_out, "\tAlias for: %s\n", - OBJ_nid2ln(pkey_base_id)); - } else { - BIO_printf(bio_out, "Name: %s\n", pinfo); - BIO_printf(bio_out, "\tType: %s Algorithm\n", - pkey_flags & ASN1_PKEY_DYNAMIC ? - "External" : "Builtin"); - BIO_printf(bio_out, "\tOID: %s\n", OBJ_nid2ln(pkey_id)); - if (pem_str == NULL) - pem_str = "(none)"; - BIO_printf(bio_out, "\tPEM string: %s\n", pem_str); - } - - } -} - -static void list_pkey_meth(void) -{ - size_t i; - size_t meth_count = EVP_PKEY_meth_get_count(); - - for (i = 0; i < meth_count; i++) { - const EVP_PKEY_METHOD *pmeth = EVP_PKEY_meth_get0(i); - int pkey_id, pkey_flags; - - EVP_PKEY_meth_get0_info(&pkey_id, &pkey_flags, pmeth); - BIO_printf(bio_out, "%s\n", OBJ_nid2ln(pkey_id)); - BIO_printf(bio_out, "\tType: %s Algorithm\n", - pkey_flags & ASN1_PKEY_DYNAMIC ? "External" : "Builtin"); - } -} - -static int function_cmp(const FUNCTION * a, const FUNCTION * b) -{ - return strncmp(a->name, b->name, 8); -} - -static unsigned long function_hash(const FUNCTION * a) -{ - return OPENSSL_LH_strhash(a->name); -} - -static int SortFnByName(const void *_f1, const void *_f2) -{ - const FUNCTION *f1 = _f1; - const FUNCTION *f2 = _f2; - - if (f1->type != f2->type) - return f1->type - f2->type; - return strcmp(f1->name, f2->name); -} - -static void list_disabled(void) -{ - BIO_puts(bio_out, "Disabled algorithms:\n"); -#ifdef OPENSSL_NO_ARIA - BIO_puts(bio_out, "ARIA\n"); -#endif -#ifdef OPENSSL_NO_BF - BIO_puts(bio_out, "BF\n"); -#endif -#ifdef OPENSSL_NO_BLAKE2 - BIO_puts(bio_out, "BLAKE2\n"); -#endif -#ifdef OPENSSL_NO_CAMELLIA - BIO_puts(bio_out, "CAMELLIA\n"); -#endif -#ifdef OPENSSL_NO_CAST - BIO_puts(bio_out, "CAST\n"); -#endif -#ifdef OPENSSL_NO_CMAC - BIO_puts(bio_out, "CMAC\n"); -#endif -#ifdef OPENSSL_NO_CMS - BIO_puts(bio_out, "CMS\n"); -#endif -#ifdef OPENSSL_NO_COMP - BIO_puts(bio_out, "COMP\n"); -#endif -#ifdef OPENSSL_NO_DES - BIO_puts(bio_out, "DES\n"); -#endif -#ifdef OPENSSL_NO_DGRAM - BIO_puts(bio_out, "DGRAM\n"); -#endif -#ifdef OPENSSL_NO_DH - BIO_puts(bio_out, "DH\n"); -#endif -#ifdef OPENSSL_NO_DSA - BIO_puts(bio_out, "DSA\n"); -#endif -#if defined(OPENSSL_NO_DTLS) - BIO_puts(bio_out, "DTLS\n"); -#endif -#if defined(OPENSSL_NO_DTLS1) - BIO_puts(bio_out, "DTLS1\n"); -#endif -#if defined(OPENSSL_NO_DTLS1_2) - BIO_puts(bio_out, "DTLS1_2\n"); -#endif -#ifdef OPENSSL_NO_EC - BIO_puts(bio_out, "EC\n"); -#endif -#ifdef OPENSSL_NO_EC2M - BIO_puts(bio_out, "EC2M\n"); -#endif -#ifdef OPENSSL_NO_ENGINE - BIO_puts(bio_out, "ENGINE\n"); -#endif -#ifdef OPENSSL_NO_GOST - BIO_puts(bio_out, "GOST\n"); -#endif -#ifdef OPENSSL_NO_HEARTBEATS - BIO_puts(bio_out, "HEARTBEATS\n"); -#endif -#ifdef OPENSSL_NO_IDEA - BIO_puts(bio_out, "IDEA\n"); -#endif -#ifdef OPENSSL_NO_MD2 - BIO_puts(bio_out, "MD2\n"); -#endif -#ifdef OPENSSL_NO_MD4 - BIO_puts(bio_out, "MD4\n"); -#endif -#ifdef OPENSSL_NO_MD5 - BIO_puts(bio_out, "MD5\n"); -#endif -#ifdef OPENSSL_NO_MDC2 - BIO_puts(bio_out, "MDC2\n"); -#endif -#ifdef OPENSSL_NO_OCB - BIO_puts(bio_out, "OCB\n"); -#endif -#ifdef OPENSSL_NO_OCSP - BIO_puts(bio_out, "OCSP\n"); -#endif -#ifdef OPENSSL_NO_PSK - BIO_puts(bio_out, "PSK\n"); -#endif -#ifdef OPENSSL_NO_RC2 - BIO_puts(bio_out, "RC2\n"); -#endif -#ifdef OPENSSL_NO_RC4 - BIO_puts(bio_out, "RC4\n"); -#endif -#ifdef OPENSSL_NO_RC5 - BIO_puts(bio_out, "RC5\n"); -#endif -#ifdef OPENSSL_NO_RMD160 - BIO_puts(bio_out, "RMD160\n"); -#endif -#ifdef OPENSSL_NO_RSA - BIO_puts(bio_out, "RSA\n"); -#endif -#ifdef OPENSSL_NO_SCRYPT - BIO_puts(bio_out, "SCRYPT\n"); -#endif -#ifdef OPENSSL_NO_SCTP - BIO_puts(bio_out, "SCTP\n"); -#endif -#ifdef OPENSSL_NO_SEED - BIO_puts(bio_out, "SEED\n"); -#endif -#ifdef OPENSSL_NO_SM2 - BIO_puts(bio_out, "SM2\n"); -#endif -#ifdef OPENSSL_NO_SM3 - BIO_puts(bio_out, "SM3\n"); -#endif -#ifdef OPENSSL_NO_SM4 - BIO_puts(bio_out, "SM4\n"); -#endif -#ifdef OPENSSL_NO_SOCK - BIO_puts(bio_out, "SOCK\n"); -#endif -#ifdef OPENSSL_NO_SRP - BIO_puts(bio_out, "SRP\n"); -#endif -#ifdef OPENSSL_NO_SRTP - BIO_puts(bio_out, "SRTP\n"); -#endif -#ifdef OPENSSL_NO_SSL3 - BIO_puts(bio_out, "SSL3\n"); -#endif -#ifdef OPENSSL_NO_TLS1 - BIO_puts(bio_out, "TLS1\n"); -#endif -#ifdef OPENSSL_NO_TLS1_1 - BIO_puts(bio_out, "TLS1_1\n"); -#endif -#ifdef OPENSSL_NO_TLS1_2 - BIO_puts(bio_out, "TLS1_2\n"); -#endif -#ifdef OPENSSL_NO_WHIRLPOOL - BIO_puts(bio_out, "WHIRLPOOL\n"); -#endif -#ifndef ZLIB - BIO_puts(bio_out, "ZLIB\n"); -#endif -} - -static LHASH_OF(FUNCTION) *prog_init(void) -{ - static LHASH_OF(FUNCTION) *ret = NULL; - static int prog_inited = 0; - FUNCTION *f; - size_t i; - - if (prog_inited) - return ret; - - prog_inited = 1; - - /* Sort alphabetically within category. For nicer help displays. */ - for (i = 0, f = functions; f->name != NULL; ++f, ++i) - ; - qsort(functions, i, sizeof(*functions), SortFnByName); - - if ((ret = lh_FUNCTION_new(function_hash, function_cmp)) == NULL) - return NULL; - - for (f = functions; f->name != NULL; f++) - (void)lh_FUNCTION_insert(ret, f); - return ret; -} diff --git a/contrib/libs/openssl/apps/opt.c b/contrib/libs/openssl/apps/opt.c deleted file mode 100644 index 666856535d..0000000000 --- a/contrib/libs/openssl/apps/opt.c +++ /dev/null @@ -1,898 +0,0 @@ -/* - * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ -#include "apps.h" -#include <string.h> -#if !defined(OPENSSL_SYS_MSDOS) -# include OPENSSL_UNISTD -#endif - -#include <stdlib.h> -#include <errno.h> -#include <ctype.h> -#include <limits.h> -#include <openssl/bio.h> -#include <openssl/x509v3.h> - -#define MAX_OPT_HELP_WIDTH 30 -const char OPT_HELP_STR[] = "--"; -const char OPT_MORE_STR[] = "---"; - -/* Our state */ -static char **argv; -static int argc; -static int opt_index; -static char *arg; -static char *flag; -static char *dunno; -static const OPTIONS *unknown; -static const OPTIONS *opts; -static char prog[40]; - -/* - * Return the simple name of the program; removing various platform gunk. - */ -#if defined(OPENSSL_SYS_WIN32) -char *opt_progname(const char *argv0) -{ - size_t i, n; - const char *p; - char *q; - - /* find the last '/', '\' or ':' */ - for (p = argv0 + strlen(argv0); --p > argv0;) - if (*p == '/' || *p == '\\' || *p == ':') { - p++; - break; - } - - /* Strip off trailing nonsense. */ - n = strlen(p); - if (n > 4 && - (strcmp(&p[n - 4], ".exe") == 0 || strcmp(&p[n - 4], ".EXE") == 0)) - n -= 4; - - /* Copy over the name, in lowercase. */ - if (n > sizeof(prog) - 1) - n = sizeof(prog) - 1; - for (q = prog, i = 0; i < n; i++, p++) - *q++ = tolower((unsigned char)*p); - *q = '\0'; - return prog; -} - -#elif defined(OPENSSL_SYS_VMS) - -char *opt_progname(const char *argv0) -{ - const char *p, *q; - - /* Find last special character sys:[foo.bar]openssl */ - for (p = argv0 + strlen(argv0); --p > argv0;) - if (*p == ':' || *p == ']' || *p == '>') { - p++; - break; - } - - q = strrchr(p, '.'); - strncpy(prog, p, sizeof(prog) - 1); - prog[sizeof(prog) - 1] = '\0'; - if (q != NULL && q - p < sizeof(prog)) - prog[q - p] = '\0'; - return prog; -} - -#else - -char *opt_progname(const char *argv0) -{ - const char *p; - - /* Could use strchr, but this is like the ones above. */ - for (p = argv0 + strlen(argv0); --p > argv0;) - if (*p == '/') { - p++; - break; - } - strncpy(prog, p, sizeof(prog) - 1); - prog[sizeof(prog) - 1] = '\0'; - return prog; -} -#endif - -char *opt_getprog(void) -{ - return prog; -} - -/* Set up the arg parsing. */ -char *opt_init(int ac, char **av, const OPTIONS *o) -{ - /* Store state. */ - argc = ac; - argv = av; - opt_index = 1; - opts = o; - opt_progname(av[0]); - unknown = NULL; - - for (; o->name; ++o) { -#ifndef NDEBUG - const OPTIONS *next; - int duplicated, i; -#endif - - if (o->name == OPT_HELP_STR || o->name == OPT_MORE_STR) - continue; -#ifndef NDEBUG - i = o->valtype; - - /* Make sure options are legit. */ - assert(o->name[0] != '-'); - assert(o->retval > 0); - switch (i) { - case 0: case '-': case '/': case '<': case '>': case 'E': case 'F': - case 'M': case 'U': case 'f': case 'l': case 'n': case 'p': case 's': - case 'u': case 'c': - break; - default: - assert(0); - } - - /* Make sure there are no duplicates. */ - for (next = o + 1; next->name; ++next) { - /* - * Some compilers inline strcmp and the assert string is too long. - */ - duplicated = strcmp(o->name, next->name) == 0; - assert(!duplicated); - } -#endif - if (o->name[0] == '\0') { - assert(unknown == NULL); - unknown = o; - assert(unknown->valtype == 0 || unknown->valtype == '-'); - } - } - return prog; -} - -static OPT_PAIR formats[] = { - {"PEM/DER", OPT_FMT_PEMDER}, - {"pkcs12", OPT_FMT_PKCS12}, - {"smime", OPT_FMT_SMIME}, - {"engine", OPT_FMT_ENGINE}, - {"msblob", OPT_FMT_MSBLOB}, - {"nss", OPT_FMT_NSS}, - {"text", OPT_FMT_TEXT}, - {"http", OPT_FMT_HTTP}, - {"pvk", OPT_FMT_PVK}, - {NULL} -}; - -/* Print an error message about a failed format parse. */ -int opt_format_error(const char *s, unsigned long flags) -{ - OPT_PAIR *ap; - - if (flags == OPT_FMT_PEMDER) { - BIO_printf(bio_err, "%s: Bad format \"%s\"; must be pem or der\n", - prog, s); - } else { - BIO_printf(bio_err, "%s: Bad format \"%s\"; must be one of:\n", - prog, s); - for (ap = formats; ap->name; ap++) - if (flags & ap->retval) - BIO_printf(bio_err, " %s\n", ap->name); - } - return 0; -} - -/* Parse a format string, put it into *result; return 0 on failure, else 1. */ -int opt_format(const char *s, unsigned long flags, int *result) -{ - switch (*s) { - default: - return 0; - case 'D': - case 'd': - if ((flags & OPT_FMT_PEMDER) == 0) - return opt_format_error(s, flags); - *result = FORMAT_ASN1; - break; - case 'T': - case 't': - if ((flags & OPT_FMT_TEXT) == 0) - return opt_format_error(s, flags); - *result = FORMAT_TEXT; - break; - case 'N': - case 'n': - if ((flags & OPT_FMT_NSS) == 0) - return opt_format_error(s, flags); - if (strcmp(s, "NSS") != 0 && strcmp(s, "nss") != 0) - return opt_format_error(s, flags); - *result = FORMAT_NSS; - break; - case 'S': - case 's': - if ((flags & OPT_FMT_SMIME) == 0) - return opt_format_error(s, flags); - *result = FORMAT_SMIME; - break; - case 'M': - case 'm': - if ((flags & OPT_FMT_MSBLOB) == 0) - return opt_format_error(s, flags); - *result = FORMAT_MSBLOB; - break; - case 'E': - case 'e': - if ((flags & OPT_FMT_ENGINE) == 0) - return opt_format_error(s, flags); - *result = FORMAT_ENGINE; - break; - case 'H': - case 'h': - if ((flags & OPT_FMT_HTTP) == 0) - return opt_format_error(s, flags); - *result = FORMAT_HTTP; - break; - case '1': - if ((flags & OPT_FMT_PKCS12) == 0) - return opt_format_error(s, flags); - *result = FORMAT_PKCS12; - break; - case 'P': - case 'p': - if (s[1] == '\0' || strcmp(s, "PEM") == 0 || strcmp(s, "pem") == 0) { - if ((flags & OPT_FMT_PEMDER) == 0) - return opt_format_error(s, flags); - *result = FORMAT_PEM; - } else if (strcmp(s, "PVK") == 0 || strcmp(s, "pvk") == 0) { - if ((flags & OPT_FMT_PVK) == 0) - return opt_format_error(s, flags); - *result = FORMAT_PVK; - } else if (strcmp(s, "P12") == 0 || strcmp(s, "p12") == 0 - || strcmp(s, "PKCS12") == 0 || strcmp(s, "pkcs12") == 0) { - if ((flags & OPT_FMT_PKCS12) == 0) - return opt_format_error(s, flags); - *result = FORMAT_PKCS12; - } else { - return 0; - } - break; - } - return 1; -} - -/* Parse a cipher name, put it in *EVP_CIPHER; return 0 on failure, else 1. */ -int opt_cipher(const char *name, const EVP_CIPHER **cipherp) -{ - *cipherp = EVP_get_cipherbyname(name); - if (*cipherp != NULL) - return 1; - BIO_printf(bio_err, "%s: Unrecognized flag %s\n", prog, name); - return 0; -} - -/* - * Parse message digest name, put it in *EVP_MD; return 0 on failure, else 1. - */ -int opt_md(const char *name, const EVP_MD **mdp) -{ - *mdp = EVP_get_digestbyname(name); - if (*mdp != NULL) - return 1; - BIO_printf(bio_err, "%s: Unrecognized flag %s\n", prog, name); - return 0; -} - -/* Look through a list of name/value pairs. */ -int opt_pair(const char *name, const OPT_PAIR* pairs, int *result) -{ - const OPT_PAIR *pp; - - for (pp = pairs; pp->name; pp++) - if (strcmp(pp->name, name) == 0) { - *result = pp->retval; - return 1; - } - BIO_printf(bio_err, "%s: Value must be one of:\n", prog); - for (pp = pairs; pp->name; pp++) - BIO_printf(bio_err, "\t%s\n", pp->name); - return 0; -} - -/* Parse an int, put it into *result; return 0 on failure, else 1. */ -int opt_int(const char *value, int *result) -{ - long l; - - if (!opt_long(value, &l)) - return 0; - *result = (int)l; - if (*result != l) { - BIO_printf(bio_err, "%s: Value \"%s\" outside integer range\n", - prog, value); - return 0; - } - return 1; -} - -static void opt_number_error(const char *v) -{ - size_t i = 0; - struct strstr_pair_st { - char *prefix; - char *name; - } b[] = { - {"0x", "a hexadecimal"}, - {"0X", "a hexadecimal"}, - {"0", "an octal"} - }; - - for (i = 0; i < OSSL_NELEM(b); i++) { - if (strncmp(v, b[i].prefix, strlen(b[i].prefix)) == 0) { - BIO_printf(bio_err, - "%s: Can't parse \"%s\" as %s number\n", - prog, v, b[i].name); - return; - } - } - BIO_printf(bio_err, "%s: Can't parse \"%s\" as a number\n", prog, v); - return; -} - -/* Parse a long, put it into *result; return 0 on failure, else 1. */ -int opt_long(const char *value, long *result) -{ - int oerrno = errno; - long l; - char *endp; - - errno = 0; - l = strtol(value, &endp, 0); - if (*endp - || endp == value - || ((l == LONG_MAX || l == LONG_MIN) && errno == ERANGE) - || (l == 0 && errno != 0)) { - opt_number_error(value); - errno = oerrno; - return 0; - } - *result = l; - errno = oerrno; - return 1; -} - -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \ - defined(INTMAX_MAX) && defined(UINTMAX_MAX) - -/* Parse an intmax_t, put it into *result; return 0 on failure, else 1. */ -int opt_imax(const char *value, intmax_t *result) -{ - int oerrno = errno; - intmax_t m; - char *endp; - - errno = 0; - m = strtoimax(value, &endp, 0); - if (*endp - || endp == value - || ((m == INTMAX_MAX || m == INTMAX_MIN) && errno == ERANGE) - || (m == 0 && errno != 0)) { - opt_number_error(value); - errno = oerrno; - return 0; - } - *result = m; - errno = oerrno; - return 1; -} - -/* Parse a uintmax_t, put it into *result; return 0 on failure, else 1. */ -int opt_umax(const char *value, uintmax_t *result) -{ - int oerrno = errno; - uintmax_t m; - char *endp; - - errno = 0; - m = strtoumax(value, &endp, 0); - if (*endp - || endp == value - || (m == UINTMAX_MAX && errno == ERANGE) - || (m == 0 && errno != 0)) { - opt_number_error(value); - errno = oerrno; - return 0; - } - *result = m; - errno = oerrno; - return 1; -} -#endif - -/* - * Parse an unsigned long, put it into *result; return 0 on failure, else 1. - */ -int opt_ulong(const char *value, unsigned long *result) -{ - int oerrno = errno; - char *endptr; - unsigned long l; - - errno = 0; - l = strtoul(value, &endptr, 0); - if (*endptr - || endptr == value - || ((l == ULONG_MAX) && errno == ERANGE) - || (l == 0 && errno != 0)) { - opt_number_error(value); - errno = oerrno; - return 0; - } - *result = l; - errno = oerrno; - return 1; -} - -/* - * We pass opt as an int but cast it to "enum range" so that all the - * items in the OPT_V_ENUM enumeration are caught; this makes -Wswitch - * in gcc do the right thing. - */ -enum range { OPT_V_ENUM }; - -int opt_verify(int opt, X509_VERIFY_PARAM *vpm) -{ - int i; - ossl_intmax_t t = 0; - ASN1_OBJECT *otmp; - X509_PURPOSE *xptmp; - const X509_VERIFY_PARAM *vtmp; - - assert(vpm != NULL); - assert(opt > OPT_V__FIRST); - assert(opt < OPT_V__LAST); - - switch ((enum range)opt) { - case OPT_V__FIRST: - case OPT_V__LAST: - return 0; - case OPT_V_POLICY: - otmp = OBJ_txt2obj(opt_arg(), 0); - if (otmp == NULL) { - BIO_printf(bio_err, "%s: Invalid Policy %s\n", prog, opt_arg()); - return 0; - } - X509_VERIFY_PARAM_add0_policy(vpm, otmp); - break; - case OPT_V_PURPOSE: - /* purpose name -> purpose index */ - i = X509_PURPOSE_get_by_sname(opt_arg()); - if (i < 0) { - BIO_printf(bio_err, "%s: Invalid purpose %s\n", prog, opt_arg()); - return 0; - } - - /* purpose index -> purpose object */ - xptmp = X509_PURPOSE_get0(i); - - /* purpose object -> purpose value */ - i = X509_PURPOSE_get_id(xptmp); - - if (!X509_VERIFY_PARAM_set_purpose(vpm, i)) { - BIO_printf(bio_err, - "%s: Internal error setting purpose %s\n", - prog, opt_arg()); - return 0; - } - break; - case OPT_V_VERIFY_NAME: - vtmp = X509_VERIFY_PARAM_lookup(opt_arg()); - if (vtmp == NULL) { - BIO_printf(bio_err, "%s: Invalid verify name %s\n", - prog, opt_arg()); - return 0; - } - X509_VERIFY_PARAM_set1(vpm, vtmp); - break; - case OPT_V_VERIFY_DEPTH: - i = atoi(opt_arg()); - if (i >= 0) - X509_VERIFY_PARAM_set_depth(vpm, i); - break; - case OPT_V_VERIFY_AUTH_LEVEL: - i = atoi(opt_arg()); - if (i >= 0) - X509_VERIFY_PARAM_set_auth_level(vpm, i); - break; - case OPT_V_ATTIME: - if (!opt_imax(opt_arg(), &t)) - return 0; - if (t != (time_t)t) { - BIO_printf(bio_err, "%s: epoch time out of range %s\n", - prog, opt_arg()); - return 0; - } - X509_VERIFY_PARAM_set_time(vpm, (time_t)t); - break; - case OPT_V_VERIFY_HOSTNAME: - if (!X509_VERIFY_PARAM_set1_host(vpm, opt_arg(), 0)) - return 0; - break; - case OPT_V_VERIFY_EMAIL: - if (!X509_VERIFY_PARAM_set1_email(vpm, opt_arg(), 0)) - return 0; - break; - case OPT_V_VERIFY_IP: - if (!X509_VERIFY_PARAM_set1_ip_asc(vpm, opt_arg())) - return 0; - break; - case OPT_V_IGNORE_CRITICAL: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_IGNORE_CRITICAL); - break; - case OPT_V_ISSUER_CHECKS: - /* NOP, deprecated */ - break; - case OPT_V_CRL_CHECK: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_CRL_CHECK); - break; - case OPT_V_CRL_CHECK_ALL: - X509_VERIFY_PARAM_set_flags(vpm, - X509_V_FLAG_CRL_CHECK | - X509_V_FLAG_CRL_CHECK_ALL); - break; - case OPT_V_POLICY_CHECK: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_POLICY_CHECK); - break; - case OPT_V_EXPLICIT_POLICY: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_EXPLICIT_POLICY); - break; - case OPT_V_INHIBIT_ANY: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_INHIBIT_ANY); - break; - case OPT_V_INHIBIT_MAP: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_INHIBIT_MAP); - break; - case OPT_V_X509_STRICT: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_X509_STRICT); - break; - case OPT_V_EXTENDED_CRL: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_EXTENDED_CRL_SUPPORT); - break; - case OPT_V_USE_DELTAS: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_USE_DELTAS); - break; - case OPT_V_POLICY_PRINT: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_NOTIFY_POLICY); - break; - case OPT_V_CHECK_SS_SIG: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_CHECK_SS_SIGNATURE); - break; - case OPT_V_TRUSTED_FIRST: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_TRUSTED_FIRST); - break; - case OPT_V_SUITEB_128_ONLY: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_SUITEB_128_LOS_ONLY); - break; - case OPT_V_SUITEB_128: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_SUITEB_128_LOS); - break; - case OPT_V_SUITEB_192: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_SUITEB_192_LOS); - break; - case OPT_V_PARTIAL_CHAIN: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_PARTIAL_CHAIN); - break; - case OPT_V_NO_ALT_CHAINS: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_NO_ALT_CHAINS); - break; - case OPT_V_NO_CHECK_TIME: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_NO_CHECK_TIME); - break; - case OPT_V_ALLOW_PROXY_CERTS: - X509_VERIFY_PARAM_set_flags(vpm, X509_V_FLAG_ALLOW_PROXY_CERTS); - break; - } - return 1; - -} - -/* - * Parse the next flag (and value if specified), return 0 if done, -1 on - * error, otherwise the flag's retval. - */ -int opt_next(void) -{ - char *p; - const OPTIONS *o; - int ival; - long lval; - unsigned long ulval; - ossl_intmax_t imval; - ossl_uintmax_t umval; - - /* Look at current arg; at end of the list? */ - arg = NULL; - p = argv[opt_index]; - if (p == NULL) - return 0; - - /* If word doesn't start with a -, we're done. */ - if (*p != '-') - return 0; - - /* Hit "--" ? We're done. */ - opt_index++; - if (strcmp(p, "--") == 0) - return 0; - - /* Allow -nnn and --nnn */ - if (*++p == '-') - p++; - flag = p - 1; - - /* If we have --flag=foo, snip it off */ - if ((arg = strchr(p, '=')) != NULL) - *arg++ = '\0'; - for (o = opts; o->name; ++o) { - /* If not this option, move on to the next one. */ - if (strcmp(p, o->name) != 0) - continue; - - /* If it doesn't take a value, make sure none was given. */ - if (o->valtype == 0 || o->valtype == '-') { - if (arg) { - BIO_printf(bio_err, - "%s: Option -%s does not take a value\n", prog, p); - return -1; - } - return o->retval; - } - - /* Want a value; get the next param if =foo not used. */ - if (arg == NULL) { - if (argv[opt_index] == NULL) { - BIO_printf(bio_err, - "%s: Option -%s needs a value\n", prog, o->name); - return -1; - } - arg = argv[opt_index++]; - } - - /* Syntax-check value. */ - switch (o->valtype) { - default: - case 's': - /* Just a string. */ - break; - case '/': - if (app_isdir(arg) > 0) - break; - BIO_printf(bio_err, "%s: Not a directory: %s\n", prog, arg); - return -1; - case '<': - /* Input file. */ - break; - case '>': - /* Output file. */ - break; - case 'p': - case 'n': - if (!opt_int(arg, &ival) - || (o->valtype == 'p' && ival <= 0)) { - BIO_printf(bio_err, - "%s: Non-positive number \"%s\" for -%s\n", - prog, arg, o->name); - return -1; - } - break; - case 'M': - if (!opt_imax(arg, &imval)) { - BIO_printf(bio_err, - "%s: Invalid number \"%s\" for -%s\n", - prog, arg, o->name); - return -1; - } - break; - case 'U': - if (!opt_umax(arg, &umval)) { - BIO_printf(bio_err, - "%s: Invalid number \"%s\" for -%s\n", - prog, arg, o->name); - return -1; - } - break; - case 'l': - if (!opt_long(arg, &lval)) { - BIO_printf(bio_err, - "%s: Invalid number \"%s\" for -%s\n", - prog, arg, o->name); - return -1; - } - break; - case 'u': - if (!opt_ulong(arg, &ulval)) { - BIO_printf(bio_err, - "%s: Invalid number \"%s\" for -%s\n", - prog, arg, o->name); - return -1; - } - break; - case 'c': - case 'E': - case 'F': - case 'f': - if (opt_format(arg, - o->valtype == 'c' ? OPT_FMT_PDS : - o->valtype == 'E' ? OPT_FMT_PDE : - o->valtype == 'F' ? OPT_FMT_PEMDER - : OPT_FMT_ANY, &ival)) - break; - BIO_printf(bio_err, - "%s: Invalid format \"%s\" for -%s\n", - prog, arg, o->name); - return -1; - } - - /* Return the flag value. */ - return o->retval; - } - if (unknown != NULL) { - dunno = p; - return unknown->retval; - } - BIO_printf(bio_err, "%s: Option unknown option -%s\n", prog, p); - return -1; -} - -/* Return the most recent flag parameter. */ -char *opt_arg(void) -{ - return arg; -} - -/* Return the most recent flag. */ -char *opt_flag(void) -{ - return flag; -} - -/* Return the unknown option. */ -char *opt_unknown(void) -{ - return dunno; -} - -/* Return the rest of the arguments after parsing flags. */ -char **opt_rest(void) -{ - return &argv[opt_index]; -} - -/* How many items in remaining args? */ -int opt_num_rest(void) -{ - int i = 0; - char **pp; - - for (pp = opt_rest(); *pp; pp++, i++) - continue; - return i; -} - -/* Return a string describing the parameter type. */ -static const char *valtype2param(const OPTIONS *o) -{ - switch (o->valtype) { - case 0: - case '-': - return ""; - case 's': - return "val"; - case '/': - return "dir"; - case '<': - return "infile"; - case '>': - return "outfile"; - case 'p': - return "+int"; - case 'n': - return "int"; - case 'l': - return "long"; - case 'u': - return "ulong"; - case 'E': - return "PEM|DER|ENGINE"; - case 'F': - return "PEM|DER"; - case 'f': - return "format"; - case 'M': - return "intmax"; - case 'U': - return "uintmax"; - } - return "parm"; -} - -void opt_help(const OPTIONS *list) -{ - const OPTIONS *o; - int i; - int standard_prolog; - int width = 5; - char start[80 + 1]; - char *p; - const char *help; - - /* Starts with its own help message? */ - standard_prolog = list[0].name != OPT_HELP_STR; - - /* Find the widest help. */ - for (o = list; o->name; o++) { - if (o->name == OPT_MORE_STR) - continue; - i = 2 + (int)strlen(o->name); - if (o->valtype != '-') - i += 1 + strlen(valtype2param(o)); - if (i < MAX_OPT_HELP_WIDTH && i > width) - width = i; - assert(i < (int)sizeof(start)); - } - - if (standard_prolog) - BIO_printf(bio_err, "Usage: %s [options]\nValid options are:\n", - prog); - - /* Now let's print. */ - for (o = list; o->name; o++) { - help = o->helpstr ? o->helpstr : "(No additional info)"; - if (o->name == OPT_HELP_STR) { - BIO_printf(bio_err, help, prog); - continue; - } - - /* Pad out prefix */ - memset(start, ' ', sizeof(start) - 1); - start[sizeof(start) - 1] = '\0'; - - if (o->name == OPT_MORE_STR) { - /* Continuation of previous line; pad and print. */ - start[width] = '\0'; - BIO_printf(bio_err, "%s %s\n", start, help); - continue; - } - - /* Build up the "-flag [param]" part. */ - p = start; - *p++ = ' '; - *p++ = '-'; - if (o->name[0]) - p += strlen(strcpy(p, o->name)); - else - *p++ = '*'; - if (o->valtype != '-') { - *p++ = ' '; - p += strlen(strcpy(p, valtype2param(o))); - } - *p = ' '; - if ((int)(p - start) >= MAX_OPT_HELP_WIDTH) { - *p = '\0'; - BIO_printf(bio_err, "%s\n", start); - memset(start, ' ', sizeof(start)); - } - start[width] = '\0'; - BIO_printf(bio_err, "%s %s\n", start, help); - } -} diff --git a/contrib/libs/openssl/apps/passwd.c b/contrib/libs/openssl/apps/passwd.c deleted file mode 100644 index d741d05335..0000000000 --- a/contrib/libs/openssl/apps/passwd.c +++ /dev/null @@ -1,853 +0,0 @@ -/* - * Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <string.h> - -#include "apps.h" -#include "progs.h" - -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#ifndef OPENSSL_NO_DES -# include <openssl/des.h> -#endif -#include <openssl/md5.h> -#include <openssl/sha.h> - -static unsigned const char cov_2char[64] = { - /* from crypto/des/fcrypt.c */ - 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, - 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, - 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, - 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, - 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, - 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A -}; - -static const char ascii_dollar[] = { 0x24, 0x00 }; - -typedef enum { - passwd_unset = 0, - passwd_crypt, - passwd_md5, - passwd_apr1, - passwd_sha256, - passwd_sha512, - passwd_aixmd5 -} passwd_modes; - -static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p, - char *passwd, BIO *out, int quiet, int table, - int reverse, size_t pw_maxlen, passwd_modes mode); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_IN, - OPT_NOVERIFY, OPT_QUIET, OPT_TABLE, OPT_REVERSE, OPT_APR1, - OPT_1, OPT_5, OPT_6, OPT_CRYPT, OPT_AIXMD5, OPT_SALT, OPT_STDIN, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS passwd_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, '<', "Read passwords from file"}, - {"noverify", OPT_NOVERIFY, '-', - "Never verify when reading password from terminal"}, - {"quiet", OPT_QUIET, '-', "No warnings"}, - {"table", OPT_TABLE, '-', "Format output as table"}, - {"reverse", OPT_REVERSE, '-', "Switch table columns"}, - {"salt", OPT_SALT, 's', "Use provided salt"}, - {"stdin", OPT_STDIN, '-', "Read passwords from stdin"}, - {"6", OPT_6, '-', "SHA512-based password algorithm"}, - {"5", OPT_5, '-', "SHA256-based password algorithm"}, - {"apr1", OPT_APR1, '-', "MD5-based password algorithm, Apache variant"}, - {"1", OPT_1, '-', "MD5-based password algorithm"}, - {"aixmd5", OPT_AIXMD5, '-', "AIX MD5-based password algorithm"}, -#ifndef OPENSSL_NO_DES - {"crypt", OPT_CRYPT, '-', "Standard Unix password algorithm (default)"}, -#endif - OPT_R_OPTIONS, - {NULL} -}; - -int passwd_main(int argc, char **argv) -{ - BIO *in = NULL; - char *infile = NULL, *salt = NULL, *passwd = NULL, **passwds = NULL; - char *salt_malloc = NULL, *passwd_malloc = NULL, *prog; - OPTION_CHOICE o; - int in_stdin = 0, pw_source_defined = 0; -#ifndef OPENSSL_NO_UI_CONSOLE - int in_noverify = 0; -#endif - int passed_salt = 0, quiet = 0, table = 0, reverse = 0; - int ret = 1; - passwd_modes mode = passwd_unset; - size_t passwd_malloc_size = 0; - size_t pw_maxlen = 256; /* arbitrary limit, should be enough for most - * passwords */ - - prog = opt_init(argc, argv, passwd_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(passwd_options); - ret = 0; - goto end; - case OPT_IN: - if (pw_source_defined) - goto opthelp; - infile = opt_arg(); - pw_source_defined = 1; - break; - case OPT_NOVERIFY: -#ifndef OPENSSL_NO_UI_CONSOLE - in_noverify = 1; -#endif - break; - case OPT_QUIET: - quiet = 1; - break; - case OPT_TABLE: - table = 1; - break; - case OPT_REVERSE: - reverse = 1; - break; - case OPT_1: - if (mode != passwd_unset) - goto opthelp; - mode = passwd_md5; - break; - case OPT_5: - if (mode != passwd_unset) - goto opthelp; - mode = passwd_sha256; - break; - case OPT_6: - if (mode != passwd_unset) - goto opthelp; - mode = passwd_sha512; - break; - case OPT_APR1: - if (mode != passwd_unset) - goto opthelp; - mode = passwd_apr1; - break; - case OPT_AIXMD5: - if (mode != passwd_unset) - goto opthelp; - mode = passwd_aixmd5; - break; - case OPT_CRYPT: -#ifndef OPENSSL_NO_DES - if (mode != passwd_unset) - goto opthelp; - mode = passwd_crypt; -#endif - break; - case OPT_SALT: - passed_salt = 1; - salt = opt_arg(); - break; - case OPT_STDIN: - if (pw_source_defined) - goto opthelp; - in_stdin = 1; - pw_source_defined = 1; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (*argv != NULL) { - if (pw_source_defined) - goto opthelp; - pw_source_defined = 1; - passwds = argv; - } - - if (mode == passwd_unset) { - /* use default */ - mode = passwd_crypt; - } - -#ifdef OPENSSL_NO_DES - if (mode == passwd_crypt) - goto opthelp; -#endif - - if (infile != NULL && in_stdin) { - BIO_printf(bio_err, "%s: Can't combine -in and -stdin\n", prog); - goto end; - } - - if (infile != NULL || in_stdin) { - /* - * If in_stdin is true, we know that infile is NULL, and that - * bio_open_default() will give us back an alias for stdin. - */ - in = bio_open_default(infile, 'r', FORMAT_TEXT); - if (in == NULL) - goto end; - } - - if (mode == passwd_crypt) - pw_maxlen = 8; - - if (passwds == NULL) { - /* no passwords on the command line */ - - passwd_malloc_size = pw_maxlen + 2; - /* longer than necessary so that we can warn about truncation */ - passwd = passwd_malloc = - app_malloc(passwd_malloc_size, "password buffer"); - } - - if ((in == NULL) && (passwds == NULL)) { - /* - * we use the following method to make sure what - * in the 'else' section is always compiled, to - * avoid rot of not-frequently-used code. - */ - if (1) { -#ifndef OPENSSL_NO_UI_CONSOLE - /* build a null-terminated list */ - static char *passwds_static[2] = { NULL, NULL }; - - passwds = passwds_static; - if (in == NULL) { - if (EVP_read_pw_string - (passwd_malloc, passwd_malloc_size, "Password: ", - !(passed_salt || in_noverify)) != 0) - goto end; - } - passwds[0] = passwd_malloc; - } else { -#endif - BIO_printf(bio_err, "password required\n"); - goto end; - } - } - - if (in == NULL) { - assert(passwds != NULL); - assert(*passwds != NULL); - - do { /* loop over list of passwords */ - passwd = *passwds++; - if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, bio_out, - quiet, table, reverse, pw_maxlen, mode)) - goto end; - } while (*passwds != NULL); - } else { - /* in != NULL */ - int done; - - assert(passwd != NULL); - do { - int r = BIO_gets(in, passwd, pw_maxlen + 1); - if (r > 0) { - char *c = (strchr(passwd, '\n')); - if (c != NULL) { - *c = 0; /* truncate at newline */ - } else { - /* ignore rest of line */ - char trash[BUFSIZ]; - do - r = BIO_gets(in, trash, sizeof(trash)); - while ((r > 0) && (!strchr(trash, '\n'))); - } - - if (!do_passwd - (passed_salt, &salt, &salt_malloc, passwd, bio_out, quiet, - table, reverse, pw_maxlen, mode)) - goto end; - } - done = (r <= 0); - } while (!done); - } - ret = 0; - - end: -#if 0 - ERR_print_errors(bio_err); -#endif - OPENSSL_free(salt_malloc); - OPENSSL_free(passwd_malloc); - BIO_free(in); - return ret; -} - -/* - * MD5-based password algorithm (should probably be available as a library - * function; then the static buffer would not be acceptable). For magic - * string "1", this should be compatible to the MD5-based BSD password - * algorithm. For 'magic' string "apr1", this is compatible to the MD5-based - * Apache password algorithm. (Apparently, the Apache password algorithm is - * identical except that the 'magic' string was changed -- the laziest - * application of the NIH principle I've ever encountered.) - */ -static char *md5crypt(const char *passwd, const char *magic, const char *salt) -{ - /* "$apr1$..salt..$.......md5hash..........\0" */ - static char out_buf[6 + 9 + 24 + 2]; - unsigned char buf[MD5_DIGEST_LENGTH]; - char ascii_magic[5]; /* "apr1" plus '\0' */ - char ascii_salt[9]; /* Max 8 chars plus '\0' */ - char *ascii_passwd = NULL; - char *salt_out; - int n; - unsigned int i; - EVP_MD_CTX *md = NULL, *md2 = NULL; - size_t passwd_len, salt_len, magic_len; - - passwd_len = strlen(passwd); - - out_buf[0] = 0; - magic_len = strlen(magic); - OPENSSL_strlcpy(ascii_magic, magic, sizeof(ascii_magic)); -#ifdef CHARSET_EBCDIC - if ((magic[0] & 0x80) != 0) /* High bit is 1 in EBCDIC alnums */ - ebcdic2ascii(ascii_magic, ascii_magic, magic_len); -#endif - - /* The salt gets truncated to 8 chars */ - OPENSSL_strlcpy(ascii_salt, salt, sizeof(ascii_salt)); - salt_len = strlen(ascii_salt); -#ifdef CHARSET_EBCDIC - ebcdic2ascii(ascii_salt, ascii_salt, salt_len); -#endif - -#ifdef CHARSET_EBCDIC - ascii_passwd = OPENSSL_strdup(passwd); - if (ascii_passwd == NULL) - return NULL; - ebcdic2ascii(ascii_passwd, ascii_passwd, passwd_len); - passwd = ascii_passwd; -#endif - - if (magic_len > 0) { - OPENSSL_strlcat(out_buf, ascii_dollar, sizeof(out_buf)); - - if (magic_len > 4) /* assert it's "1" or "apr1" */ - goto err; - - OPENSSL_strlcat(out_buf, ascii_magic, sizeof(out_buf)); - OPENSSL_strlcat(out_buf, ascii_dollar, sizeof(out_buf)); - } - - OPENSSL_strlcat(out_buf, ascii_salt, sizeof(out_buf)); - - if (strlen(out_buf) > 6 + 8) /* assert "$apr1$..salt.." */ - goto err; - - salt_out = out_buf; - if (magic_len > 0) - salt_out += 2 + magic_len; - - if (salt_len > 8) - goto err; - - md = EVP_MD_CTX_new(); - if (md == NULL - || !EVP_DigestInit_ex(md, EVP_md5(), NULL) - || !EVP_DigestUpdate(md, passwd, passwd_len)) - goto err; - - if (magic_len > 0) - if (!EVP_DigestUpdate(md, ascii_dollar, 1) - || !EVP_DigestUpdate(md, ascii_magic, magic_len) - || !EVP_DigestUpdate(md, ascii_dollar, 1)) - goto err; - - if (!EVP_DigestUpdate(md, ascii_salt, salt_len)) - goto err; - - md2 = EVP_MD_CTX_new(); - if (md2 == NULL - || !EVP_DigestInit_ex(md2, EVP_md5(), NULL) - || !EVP_DigestUpdate(md2, passwd, passwd_len) - || !EVP_DigestUpdate(md2, ascii_salt, salt_len) - || !EVP_DigestUpdate(md2, passwd, passwd_len) - || !EVP_DigestFinal_ex(md2, buf, NULL)) - goto err; - - for (i = passwd_len; i > sizeof(buf); i -= sizeof(buf)) { - if (!EVP_DigestUpdate(md, buf, sizeof(buf))) - goto err; - } - if (!EVP_DigestUpdate(md, buf, i)) - goto err; - - n = passwd_len; - while (n) { - if (!EVP_DigestUpdate(md, (n & 1) ? "\0" : passwd, 1)) - goto err; - n >>= 1; - } - if (!EVP_DigestFinal_ex(md, buf, NULL)) - return NULL; - - for (i = 0; i < 1000; i++) { - if (!EVP_DigestInit_ex(md2, EVP_md5(), NULL)) - goto err; - if (!EVP_DigestUpdate(md2, - (i & 1) ? (unsigned const char *)passwd : buf, - (i & 1) ? passwd_len : sizeof(buf))) - goto err; - if (i % 3) { - if (!EVP_DigestUpdate(md2, ascii_salt, salt_len)) - goto err; - } - if (i % 7) { - if (!EVP_DigestUpdate(md2, passwd, passwd_len)) - goto err; - } - if (!EVP_DigestUpdate(md2, - (i & 1) ? buf : (unsigned const char *)passwd, - (i & 1) ? sizeof(buf) : passwd_len)) - goto err; - if (!EVP_DigestFinal_ex(md2, buf, NULL)) - goto err; - } - EVP_MD_CTX_free(md2); - EVP_MD_CTX_free(md); - md2 = NULL; - md = NULL; - - { - /* transform buf into output string */ - unsigned char buf_perm[sizeof(buf)]; - int dest, source; - char *output; - - /* silly output permutation */ - for (dest = 0, source = 0; dest < 14; - dest++, source = (source + 6) % 17) - buf_perm[dest] = buf[source]; - buf_perm[14] = buf[5]; - buf_perm[15] = buf[11]; -# ifndef PEDANTIC /* Unfortunately, this generates a "no - * effect" warning */ - assert(16 == sizeof(buf_perm)); -# endif - - output = salt_out + salt_len; - assert(output == out_buf + strlen(out_buf)); - - *output++ = ascii_dollar[0]; - - for (i = 0; i < 15; i += 3) { - *output++ = cov_2char[buf_perm[i + 2] & 0x3f]; - *output++ = cov_2char[((buf_perm[i + 1] & 0xf) << 2) | - (buf_perm[i + 2] >> 6)]; - *output++ = cov_2char[((buf_perm[i] & 3) << 4) | - (buf_perm[i + 1] >> 4)]; - *output++ = cov_2char[buf_perm[i] >> 2]; - } - assert(i == 15); - *output++ = cov_2char[buf_perm[i] & 0x3f]; - *output++ = cov_2char[buf_perm[i] >> 6]; - *output = 0; - assert(strlen(out_buf) < sizeof(out_buf)); -#ifdef CHARSET_EBCDIC - ascii2ebcdic(out_buf, out_buf, strlen(out_buf)); -#endif - } - - return out_buf; - - err: - OPENSSL_free(ascii_passwd); - EVP_MD_CTX_free(md2); - EVP_MD_CTX_free(md); - return NULL; -} - -/* - * SHA based password algorithm, describe by Ulrich Drepper here: - * https://www.akkadia.org/drepper/SHA-crypt.txt - * (note that it's in the public domain) - */ -static char *shacrypt(const char *passwd, const char *magic, const char *salt) -{ - /* Prefix for optional rounds specification. */ - static const char rounds_prefix[] = "rounds="; - /* Maximum salt string length. */ -# define SALT_LEN_MAX 16 - /* Default number of rounds if not explicitly specified. */ -# define ROUNDS_DEFAULT 5000 - /* Minimum number of rounds. */ -# define ROUNDS_MIN 1000 - /* Maximum number of rounds. */ -# define ROUNDS_MAX 999999999 - - /* "$6$rounds=<N>$......salt......$...shahash(up to 86 chars)...\0" */ - static char out_buf[3 + 17 + 17 + 86 + 1]; - unsigned char buf[SHA512_DIGEST_LENGTH]; - unsigned char temp_buf[SHA512_DIGEST_LENGTH]; - size_t buf_size = 0; - char ascii_magic[2]; - char ascii_salt[17]; /* Max 16 chars plus '\0' */ - char *ascii_passwd = NULL; - size_t n; - EVP_MD_CTX *md = NULL, *md2 = NULL; - const EVP_MD *sha = NULL; - size_t passwd_len, salt_len, magic_len; - unsigned int rounds = 5000; /* Default */ - char rounds_custom = 0; - char *p_bytes = NULL; - char *s_bytes = NULL; - char *cp = NULL; - - passwd_len = strlen(passwd); - magic_len = strlen(magic); - - /* assert it's "5" or "6" */ - if (magic_len != 1) - return NULL; - - switch (magic[0]) { - case '5': - sha = EVP_sha256(); - buf_size = 32; - break; - case '6': - sha = EVP_sha512(); - buf_size = 64; - break; - default: - return NULL; - } - - if (strncmp(salt, rounds_prefix, sizeof(rounds_prefix) - 1) == 0) { - const char *num = salt + sizeof(rounds_prefix) - 1; - char *endp; - unsigned long int srounds = strtoul (num, &endp, 10); - if (*endp == '$') { - salt = endp + 1; - if (srounds > ROUNDS_MAX) - rounds = ROUNDS_MAX; - else if (srounds < ROUNDS_MIN) - rounds = ROUNDS_MIN; - else - rounds = (unsigned int)srounds; - rounds_custom = 1; - } else { - return NULL; - } - } - - OPENSSL_strlcpy(ascii_magic, magic, sizeof(ascii_magic)); -#ifdef CHARSET_EBCDIC - if ((magic[0] & 0x80) != 0) /* High bit is 1 in EBCDIC alnums */ - ebcdic2ascii(ascii_magic, ascii_magic, magic_len); -#endif - - /* The salt gets truncated to 16 chars */ - OPENSSL_strlcpy(ascii_salt, salt, sizeof(ascii_salt)); - salt_len = strlen(ascii_salt); -#ifdef CHARSET_EBCDIC - ebcdic2ascii(ascii_salt, ascii_salt, salt_len); -#endif - -#ifdef CHARSET_EBCDIC - ascii_passwd = OPENSSL_strdup(passwd); - if (ascii_passwd == NULL) - return NULL; - ebcdic2ascii(ascii_passwd, ascii_passwd, passwd_len); - passwd = ascii_passwd; -#endif - - out_buf[0] = 0; - OPENSSL_strlcat(out_buf, ascii_dollar, sizeof(out_buf)); - OPENSSL_strlcat(out_buf, ascii_magic, sizeof(out_buf)); - OPENSSL_strlcat(out_buf, ascii_dollar, sizeof(out_buf)); - if (rounds_custom) { - char tmp_buf[80]; /* "rounds=999999999" */ - sprintf(tmp_buf, "rounds=%u", rounds); -#ifdef CHARSET_EBCDIC - /* In case we're really on a ASCII based platform and just pretend */ - if (tmp_buf[0] != 0x72) /* ASCII 'r' */ - ebcdic2ascii(tmp_buf, tmp_buf, strlen(tmp_buf)); -#endif - OPENSSL_strlcat(out_buf, tmp_buf, sizeof(out_buf)); - OPENSSL_strlcat(out_buf, ascii_dollar, sizeof(out_buf)); - } - OPENSSL_strlcat(out_buf, ascii_salt, sizeof(out_buf)); - - /* assert "$5$rounds=999999999$......salt......" */ - if (strlen(out_buf) > 3 + 17 * rounds_custom + salt_len ) - goto err; - - md = EVP_MD_CTX_new(); - if (md == NULL - || !EVP_DigestInit_ex(md, sha, NULL) - || !EVP_DigestUpdate(md, passwd, passwd_len) - || !EVP_DigestUpdate(md, ascii_salt, salt_len)) - goto err; - - md2 = EVP_MD_CTX_new(); - if (md2 == NULL - || !EVP_DigestInit_ex(md2, sha, NULL) - || !EVP_DigestUpdate(md2, passwd, passwd_len) - || !EVP_DigestUpdate(md2, ascii_salt, salt_len) - || !EVP_DigestUpdate(md2, passwd, passwd_len) - || !EVP_DigestFinal_ex(md2, buf, NULL)) - goto err; - - for (n = passwd_len; n > buf_size; n -= buf_size) { - if (!EVP_DigestUpdate(md, buf, buf_size)) - goto err; - } - if (!EVP_DigestUpdate(md, buf, n)) - goto err; - - n = passwd_len; - while (n) { - if (!EVP_DigestUpdate(md, - (n & 1) ? buf : (unsigned const char *)passwd, - (n & 1) ? buf_size : passwd_len)) - goto err; - n >>= 1; - } - if (!EVP_DigestFinal_ex(md, buf, NULL)) - return NULL; - - /* P sequence */ - if (!EVP_DigestInit_ex(md2, sha, NULL)) - goto err; - - for (n = passwd_len; n > 0; n--) - if (!EVP_DigestUpdate(md2, passwd, passwd_len)) - goto err; - - if (!EVP_DigestFinal_ex(md2, temp_buf, NULL)) - return NULL; - - if ((p_bytes = OPENSSL_zalloc(passwd_len)) == NULL) - goto err; - for (cp = p_bytes, n = passwd_len; n > buf_size; n -= buf_size, cp += buf_size) - memcpy(cp, temp_buf, buf_size); - memcpy(cp, temp_buf, n); - - /* S sequence */ - if (!EVP_DigestInit_ex(md2, sha, NULL)) - goto err; - - for (n = 16 + buf[0]; n > 0; n--) - if (!EVP_DigestUpdate(md2, ascii_salt, salt_len)) - goto err; - - if (!EVP_DigestFinal_ex(md2, temp_buf, NULL)) - return NULL; - - if ((s_bytes = OPENSSL_zalloc(salt_len)) == NULL) - goto err; - for (cp = s_bytes, n = salt_len; n > buf_size; n -= buf_size, cp += buf_size) - memcpy(cp, temp_buf, buf_size); - memcpy(cp, temp_buf, n); - - for (n = 0; n < rounds; n++) { - if (!EVP_DigestInit_ex(md2, sha, NULL)) - goto err; - if (!EVP_DigestUpdate(md2, - (n & 1) ? (unsigned const char *)p_bytes : buf, - (n & 1) ? passwd_len : buf_size)) - goto err; - if (n % 3) { - if (!EVP_DigestUpdate(md2, s_bytes, salt_len)) - goto err; - } - if (n % 7) { - if (!EVP_DigestUpdate(md2, p_bytes, passwd_len)) - goto err; - } - if (!EVP_DigestUpdate(md2, - (n & 1) ? buf : (unsigned const char *)p_bytes, - (n & 1) ? buf_size : passwd_len)) - goto err; - if (!EVP_DigestFinal_ex(md2, buf, NULL)) - goto err; - } - EVP_MD_CTX_free(md2); - EVP_MD_CTX_free(md); - md2 = NULL; - md = NULL; - OPENSSL_free(p_bytes); - OPENSSL_free(s_bytes); - p_bytes = NULL; - s_bytes = NULL; - - cp = out_buf + strlen(out_buf); - *cp++ = ascii_dollar[0]; - -# define b64_from_24bit(B2, B1, B0, N) \ - do { \ - unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ - int i = (N); \ - while (i-- > 0) \ - { \ - *cp++ = cov_2char[w & 0x3f]; \ - w >>= 6; \ - } \ - } while (0) - - switch (magic[0]) { - case '5': - b64_from_24bit (buf[0], buf[10], buf[20], 4); - b64_from_24bit (buf[21], buf[1], buf[11], 4); - b64_from_24bit (buf[12], buf[22], buf[2], 4); - b64_from_24bit (buf[3], buf[13], buf[23], 4); - b64_from_24bit (buf[24], buf[4], buf[14], 4); - b64_from_24bit (buf[15], buf[25], buf[5], 4); - b64_from_24bit (buf[6], buf[16], buf[26], 4); - b64_from_24bit (buf[27], buf[7], buf[17], 4); - b64_from_24bit (buf[18], buf[28], buf[8], 4); - b64_from_24bit (buf[9], buf[19], buf[29], 4); - b64_from_24bit (0, buf[31], buf[30], 3); - break; - case '6': - b64_from_24bit (buf[0], buf[21], buf[42], 4); - b64_from_24bit (buf[22], buf[43], buf[1], 4); - b64_from_24bit (buf[44], buf[2], buf[23], 4); - b64_from_24bit (buf[3], buf[24], buf[45], 4); - b64_from_24bit (buf[25], buf[46], buf[4], 4); - b64_from_24bit (buf[47], buf[5], buf[26], 4); - b64_from_24bit (buf[6], buf[27], buf[48], 4); - b64_from_24bit (buf[28], buf[49], buf[7], 4); - b64_from_24bit (buf[50], buf[8], buf[29], 4); - b64_from_24bit (buf[9], buf[30], buf[51], 4); - b64_from_24bit (buf[31], buf[52], buf[10], 4); - b64_from_24bit (buf[53], buf[11], buf[32], 4); - b64_from_24bit (buf[12], buf[33], buf[54], 4); - b64_from_24bit (buf[34], buf[55], buf[13], 4); - b64_from_24bit (buf[56], buf[14], buf[35], 4); - b64_from_24bit (buf[15], buf[36], buf[57], 4); - b64_from_24bit (buf[37], buf[58], buf[16], 4); - b64_from_24bit (buf[59], buf[17], buf[38], 4); - b64_from_24bit (buf[18], buf[39], buf[60], 4); - b64_from_24bit (buf[40], buf[61], buf[19], 4); - b64_from_24bit (buf[62], buf[20], buf[41], 4); - b64_from_24bit (0, 0, buf[63], 2); - break; - default: - goto err; - } - *cp = '\0'; -#ifdef CHARSET_EBCDIC - ascii2ebcdic(out_buf, out_buf, strlen(out_buf)); -#endif - - return out_buf; - - err: - EVP_MD_CTX_free(md2); - EVP_MD_CTX_free(md); - OPENSSL_free(p_bytes); - OPENSSL_free(s_bytes); - OPENSSL_free(ascii_passwd); - return NULL; -} - -static int do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p, - char *passwd, BIO *out, int quiet, int table, - int reverse, size_t pw_maxlen, passwd_modes mode) -{ - char *hash = NULL; - - assert(salt_p != NULL); - assert(salt_malloc_p != NULL); - - /* first make sure we have a salt */ - if (!passed_salt) { - size_t saltlen = 0; - size_t i; - -#ifndef OPENSSL_NO_DES - if (mode == passwd_crypt) - saltlen = 2; -#endif /* !OPENSSL_NO_DES */ - - if (mode == passwd_md5 || mode == passwd_apr1 || mode == passwd_aixmd5) - saltlen = 8; - - if (mode == passwd_sha256 || mode == passwd_sha512) - saltlen = 16; - - assert(saltlen != 0); - - if (*salt_malloc_p == NULL) - *salt_p = *salt_malloc_p = app_malloc(saltlen + 1, "salt buffer"); - if (RAND_bytes((unsigned char *)*salt_p, saltlen) <= 0) - goto end; - - for (i = 0; i < saltlen; i++) - (*salt_p)[i] = cov_2char[(*salt_p)[i] & 0x3f]; /* 6 bits */ - (*salt_p)[i] = 0; -# ifdef CHARSET_EBCDIC - /* The password encryption function will convert back to ASCII */ - ascii2ebcdic(*salt_p, *salt_p, saltlen); -# endif - } - - assert(*salt_p != NULL); - - /* truncate password if necessary */ - if ((strlen(passwd) > pw_maxlen)) { - if (!quiet) - /* - * XXX: really we should know how to print a size_t, not cast it - */ - BIO_printf(bio_err, - "Warning: truncating password to %u characters\n", - (unsigned)pw_maxlen); - passwd[pw_maxlen] = 0; - } - assert(strlen(passwd) <= pw_maxlen); - - /* now compute password hash */ -#ifndef OPENSSL_NO_DES - if (mode == passwd_crypt) - hash = DES_crypt(passwd, *salt_p); -#endif - if (mode == passwd_md5 || mode == passwd_apr1) - hash = md5crypt(passwd, (mode == passwd_md5 ? "1" : "apr1"), *salt_p); - if (mode == passwd_aixmd5) - hash = md5crypt(passwd, "", *salt_p); - if (mode == passwd_sha256 || mode == passwd_sha512) - hash = shacrypt(passwd, (mode == passwd_sha256 ? "5" : "6"), *salt_p); - assert(hash != NULL); - - if (table && !reverse) - BIO_printf(out, "%s\t%s\n", passwd, hash); - else if (table && reverse) - BIO_printf(out, "%s\t%s\n", hash, passwd); - else - BIO_printf(out, "%s\n", hash); - return 1; - - end: - return 0; -} diff --git a/contrib/libs/openssl/apps/pkcs12.c b/contrib/libs/openssl/apps/pkcs12.c deleted file mode 100644 index 8c5d963b8c..0000000000 --- a/contrib/libs/openssl/apps/pkcs12.c +++ /dev/null @@ -1,974 +0,0 @@ -/* - * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/crypto.h> -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/pkcs12.h> - -#define NOKEYS 0x1 -#define NOCERTS 0x2 -#define INFO 0x4 -#define CLCERTS 0x8 -#define CACERTS 0x10 - -#define PASSWD_BUF_SIZE 2048 - -static int get_cert_chain(X509 *cert, X509_STORE *store, - STACK_OF(X509) **chain); -int dump_certs_keys_p12(BIO *out, const PKCS12 *p12, - const char *pass, int passlen, int options, - char *pempass, const EVP_CIPHER *enc); -int dump_certs_pkeys_bags(BIO *out, const STACK_OF(PKCS12_SAFEBAG) *bags, - const char *pass, int passlen, int options, - char *pempass, const EVP_CIPHER *enc); -int dump_certs_pkeys_bag(BIO *out, const PKCS12_SAFEBAG *bags, - const char *pass, int passlen, - int options, char *pempass, const EVP_CIPHER *enc); -void print_attribute(BIO *out, const ASN1_TYPE *av); -int print_attribs(BIO *out, const STACK_OF(X509_ATTRIBUTE) *attrlst, - const char *name); -void hex_prin(BIO *out, unsigned char *buf, int len); -static int alg_print(const X509_ALGOR *alg); -int cert_load(BIO *in, STACK_OF(X509) *sk); -static int set_pbe(int *ppbe, const char *str); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_CIPHER, OPT_NOKEYS, OPT_KEYEX, OPT_KEYSIG, OPT_NOCERTS, OPT_CLCERTS, - OPT_CACERTS, OPT_NOOUT, OPT_INFO, OPT_CHAIN, OPT_TWOPASS, OPT_NOMACVER, - OPT_DESCERT, OPT_EXPORT, OPT_NOITER, OPT_MACITER, OPT_NOMACITER, - OPT_NOMAC, OPT_LMK, OPT_NODES, OPT_MACALG, OPT_CERTPBE, OPT_KEYPBE, - OPT_INKEY, OPT_CERTFILE, OPT_NAME, OPT_CSP, OPT_CANAME, - OPT_IN, OPT_OUT, OPT_PASSIN, OPT_PASSOUT, OPT_PASSWORD, OPT_CAPATH, - OPT_CAFILE, OPT_NOCAPATH, OPT_NOCAFILE, OPT_ENGINE, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS pkcs12_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"nokeys", OPT_NOKEYS, '-', "Don't output private keys"}, - {"keyex", OPT_KEYEX, '-', "Set MS key exchange type"}, - {"keysig", OPT_KEYSIG, '-', "Set MS key signature type"}, - {"nocerts", OPT_NOCERTS, '-', "Don't output certificates"}, - {"clcerts", OPT_CLCERTS, '-', "Only output client certificates"}, - {"cacerts", OPT_CACERTS, '-', "Only output CA certificates"}, - {"noout", OPT_NOOUT, '-', "Don't output anything, just verify"}, - {"info", OPT_INFO, '-', "Print info about PKCS#12 structure"}, - {"chain", OPT_CHAIN, '-', "Add certificate chain"}, - {"twopass", OPT_TWOPASS, '-', "Separate MAC, encryption passwords"}, - {"nomacver", OPT_NOMACVER, '-', "Don't verify MAC"}, -#ifndef OPENSSL_NO_RC2 - {"descert", OPT_DESCERT, '-', - "Encrypt output with 3DES (default RC2-40)"}, - {"certpbe", OPT_CERTPBE, 's', - "Certificate PBE algorithm (default RC2-40)"}, -#else - {"descert", OPT_DESCERT, '-', "Encrypt output with 3DES (the default)"}, - {"certpbe", OPT_CERTPBE, 's', "Certificate PBE algorithm (default 3DES)"}, -#endif - {"export", OPT_EXPORT, '-', "Output PKCS12 file"}, - {"noiter", OPT_NOITER, '-', "Don't use encryption iteration"}, - {"maciter", OPT_MACITER, '-', "Use MAC iteration"}, - {"nomaciter", OPT_NOMACITER, '-', "Don't use MAC iteration"}, - {"nomac", OPT_NOMAC, '-', "Don't generate MAC"}, - {"LMK", OPT_LMK, '-', - "Add local machine keyset attribute to private key"}, - {"nodes", OPT_NODES, '-', "Don't encrypt private keys"}, - {"macalg", OPT_MACALG, 's', - "Digest algorithm used in MAC (default SHA1)"}, - {"keypbe", OPT_KEYPBE, 's', "Private key PBE algorithm (default 3DES)"}, - OPT_R_OPTIONS, - {"inkey", OPT_INKEY, 's', "Private key if not infile"}, - {"certfile", OPT_CERTFILE, '<', "Load certs from file"}, - {"name", OPT_NAME, 's', "Use name as friendly name"}, - {"CSP", OPT_CSP, 's', "Microsoft CSP name"}, - {"caname", OPT_CANAME, 's', - "Use name as CA friendly name (can be repeated)"}, - {"in", OPT_IN, '<', "Input filename"}, - {"out", OPT_OUT, '>', "Output filename"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"password", OPT_PASSWORD, 's', "Set import/export password source"}, - {"CApath", OPT_CAPATH, '/', "PEM-format directory of CA's"}, - {"CAfile", OPT_CAFILE, '<', "PEM-format file of CA's"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int pkcs12_main(int argc, char **argv) -{ - char *infile = NULL, *outfile = NULL, *keyname = NULL, *certfile = NULL; - char *name = NULL, *csp_name = NULL; - char pass[PASSWD_BUF_SIZE] = "", macpass[PASSWD_BUF_SIZE] = ""; - int export_cert = 0, options = 0, chain = 0, twopass = 0, keytype = 0; - int iter = PKCS12_DEFAULT_ITER, maciter = PKCS12_DEFAULT_ITER; -#ifndef OPENSSL_NO_RC2 - int cert_pbe = NID_pbe_WithSHA1And40BitRC2_CBC; -#else - int cert_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; -#endif - int key_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; - int ret = 1, macver = 1, add_lmk = 0, private = 0; - int noprompt = 0; - char *passinarg = NULL, *passoutarg = NULL, *passarg = NULL; - char *passin = NULL, *passout = NULL, *macalg = NULL; - char *cpass = NULL, *mpass = NULL, *badpass = NULL; - const char *CApath = NULL, *CAfile = NULL, *prog; - int noCApath = 0, noCAfile = 0; - ENGINE *e = NULL; - BIO *in = NULL, *out = NULL; - PKCS12 *p12 = NULL; - STACK_OF(OPENSSL_STRING) *canames = NULL; - const EVP_CIPHER *enc = EVP_des_ede3_cbc(); - OPTION_CHOICE o; - - prog = opt_init(argc, argv, pkcs12_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(pkcs12_options); - ret = 0; - goto end; - case OPT_NOKEYS: - options |= NOKEYS; - break; - case OPT_KEYEX: - keytype = KEY_EX; - break; - case OPT_KEYSIG: - keytype = KEY_SIG; - break; - case OPT_NOCERTS: - options |= NOCERTS; - break; - case OPT_CLCERTS: - options |= CLCERTS; - break; - case OPT_CACERTS: - options |= CACERTS; - break; - case OPT_NOOUT: - options |= (NOKEYS | NOCERTS); - break; - case OPT_INFO: - options |= INFO; - break; - case OPT_CHAIN: - chain = 1; - break; - case OPT_TWOPASS: - twopass = 1; - break; - case OPT_NOMACVER: - macver = 0; - break; - case OPT_DESCERT: - cert_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; - break; - case OPT_EXPORT: - export_cert = 1; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &enc)) - goto opthelp; - break; - case OPT_NOITER: - iter = 1; - break; - case OPT_MACITER: - maciter = PKCS12_DEFAULT_ITER; - break; - case OPT_NOMACITER: - maciter = 1; - break; - case OPT_NOMAC: - maciter = -1; - break; - case OPT_MACALG: - macalg = opt_arg(); - break; - case OPT_NODES: - enc = NULL; - break; - case OPT_CERTPBE: - if (!set_pbe(&cert_pbe, opt_arg())) - goto opthelp; - break; - case OPT_KEYPBE: - if (!set_pbe(&key_pbe, opt_arg())) - goto opthelp; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_INKEY: - keyname = opt_arg(); - break; - case OPT_CERTFILE: - certfile = opt_arg(); - break; - case OPT_NAME: - name = opt_arg(); - break; - case OPT_LMK: - add_lmk = 1; - break; - case OPT_CSP: - csp_name = opt_arg(); - break; - case OPT_CANAME: - if (canames == NULL - && (canames = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(canames, opt_arg()); - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_PASSWORD: - passarg = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = 1; - - if (passarg != NULL) { - if (export_cert) - passoutarg = passarg; - else - passinarg = passarg; - } - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - if (cpass == NULL) { - if (export_cert) - cpass = passout; - else - cpass = passin; - } - - if (cpass != NULL) { - mpass = cpass; - noprompt = 1; - if (twopass) { - if (export_cert) - BIO_printf(bio_err, "Option -twopass cannot be used with -passout or -password\n"); - else - BIO_printf(bio_err, "Option -twopass cannot be used with -passin or -password\n"); - goto end; - } - } else { - cpass = pass; - mpass = macpass; - } - - if (twopass) { - /* To avoid bit rot */ - if (1) { -#ifndef OPENSSL_NO_UI_CONSOLE - if (EVP_read_pw_string( - macpass, sizeof(macpass), "Enter MAC Password:", export_cert)) { - BIO_printf(bio_err, "Can't read Password\n"); - goto end; - } - } else { -#endif - BIO_printf(bio_err, "Unsupported option -twopass\n"); - goto end; - } - } - - if (export_cert) { - EVP_PKEY *key = NULL; - X509 *ucert = NULL, *x = NULL; - STACK_OF(X509) *certs = NULL; - const EVP_MD *macmd = NULL; - unsigned char *catmp = NULL; - int i; - - if ((options & (NOCERTS | NOKEYS)) == (NOCERTS | NOKEYS)) { - BIO_printf(bio_err, "Nothing to do!\n"); - goto export_end; - } - - if (options & NOCERTS) - chain = 0; - - if (!(options & NOKEYS)) { - key = load_key(keyname ? keyname : infile, - FORMAT_PEM, 1, passin, e, "private key"); - if (key == NULL) - goto export_end; - } - - /* Load in all certs in input file */ - if (!(options & NOCERTS)) { - if (!load_certs(infile, &certs, FORMAT_PEM, NULL, - "certificates")) - goto export_end; - - if (key != NULL) { - /* Look for matching private key */ - for (i = 0; i < sk_X509_num(certs); i++) { - x = sk_X509_value(certs, i); - if (X509_check_private_key(x, key)) { - ucert = x; - /* Zero keyid and alias */ - X509_keyid_set1(ucert, NULL, 0); - X509_alias_set1(ucert, NULL, 0); - /* Remove from list */ - (void)sk_X509_delete(certs, i); - break; - } - } - if (ucert == NULL) { - BIO_printf(bio_err, - "No certificate matches private key\n"); - goto export_end; - } - } - - } - - /* Add any more certificates asked for */ - if (certfile != NULL) { - if (!load_certs(certfile, &certs, FORMAT_PEM, NULL, - "certificates from certfile")) - goto export_end; - } - - /* If chaining get chain from user cert */ - if (chain) { - int vret; - STACK_OF(X509) *chain2; - X509_STORE *store; - if ((store = setup_verify(CAfile, CApath, noCAfile, noCApath)) - == NULL) - goto export_end; - - vret = get_cert_chain(ucert, store, &chain2); - X509_STORE_free(store); - - if (vret == X509_V_OK) { - /* Exclude verified certificate */ - for (i = 1; i < sk_X509_num(chain2); i++) - sk_X509_push(certs, sk_X509_value(chain2, i)); - /* Free first certificate */ - X509_free(sk_X509_value(chain2, 0)); - sk_X509_free(chain2); - } else { - if (vret != X509_V_ERR_UNSPECIFIED) - BIO_printf(bio_err, "Error %s getting chain.\n", - X509_verify_cert_error_string(vret)); - else - ERR_print_errors(bio_err); - goto export_end; - } - } - - /* Add any CA names */ - - for (i = 0; i < sk_OPENSSL_STRING_num(canames); i++) { - catmp = (unsigned char *)sk_OPENSSL_STRING_value(canames, i); - X509_alias_set1(sk_X509_value(certs, i), catmp, -1); - } - - if (csp_name != NULL && key != NULL) - EVP_PKEY_add1_attr_by_NID(key, NID_ms_csp_name, - MBSTRING_ASC, (unsigned char *)csp_name, - -1); - - if (add_lmk && key != NULL) - EVP_PKEY_add1_attr_by_NID(key, NID_LocalKeySet, 0, NULL, -1); - - if (!noprompt) { - /* To avoid bit rot */ - if (1) { -#ifndef OPENSSL_NO_UI_CONSOLE - if (EVP_read_pw_string(pass, sizeof(pass), - "Enter Export Password:", 1)) { - BIO_printf(bio_err, "Can't read Password\n"); - goto export_end; - } - } else { -#endif - BIO_printf(bio_err, "Password required\n"); - goto export_end; - } - } - - if (!twopass) - OPENSSL_strlcpy(macpass, pass, sizeof(macpass)); - - p12 = PKCS12_create(cpass, name, key, ucert, certs, - key_pbe, cert_pbe, iter, -1, keytype); - - if (!p12) { - ERR_print_errors(bio_err); - goto export_end; - } - - if (macalg) { - if (!opt_md(macalg, &macmd)) - goto opthelp; - } - - if (maciter != -1) - PKCS12_set_mac(p12, mpass, -1, NULL, 0, maciter, macmd); - - assert(private); - - out = bio_open_owner(outfile, FORMAT_PKCS12, private); - if (out == NULL) - goto end; - - i2d_PKCS12_bio(out, p12); - - ret = 0; - - export_end: - - EVP_PKEY_free(key); - sk_X509_pop_free(certs, X509_free); - X509_free(ucert); - - goto end; - - } - - in = bio_open_default(infile, 'r', FORMAT_PKCS12); - if (in == NULL) - goto end; - out = bio_open_owner(outfile, FORMAT_PEM, private); - if (out == NULL) - goto end; - - if ((p12 = d2i_PKCS12_bio(in, NULL)) == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - if (!noprompt) { - if (1) { -#ifndef OPENSSL_NO_UI_CONSOLE - if (EVP_read_pw_string(pass, sizeof(pass), "Enter Import Password:", - 0)) { - BIO_printf(bio_err, "Can't read Password\n"); - goto end; - } - } else { -#endif - BIO_printf(bio_err, "Password required\n"); - goto end; - } - } - - if (!twopass) - OPENSSL_strlcpy(macpass, pass, sizeof(macpass)); - - if ((options & INFO) && PKCS12_mac_present(p12)) { - const ASN1_INTEGER *tmaciter; - const X509_ALGOR *macalgid; - const ASN1_OBJECT *macobj; - const ASN1_OCTET_STRING *tmac; - const ASN1_OCTET_STRING *tsalt; - - PKCS12_get0_mac(&tmac, &macalgid, &tsalt, &tmaciter, p12); - /* current hash algorithms do not use parameters so extract just name, - in future alg_print() may be needed */ - X509_ALGOR_get0(&macobj, NULL, NULL, macalgid); - BIO_puts(bio_err, "MAC: "); - i2a_ASN1_OBJECT(bio_err, macobj); - BIO_printf(bio_err, ", Iteration %ld\n", - tmaciter != NULL ? ASN1_INTEGER_get(tmaciter) : 1L); - BIO_printf(bio_err, "MAC length: %ld, salt length: %ld\n", - tmac != NULL ? ASN1_STRING_length(tmac) : 0L, - tsalt != NULL ? ASN1_STRING_length(tsalt) : 0L); - } - if (macver) { - /* If we enter empty password try no password first */ - if (!mpass[0] && PKCS12_verify_mac(p12, NULL, 0)) { - /* If mac and crypto pass the same set it to NULL too */ - if (!twopass) - cpass = NULL; - } else if (!PKCS12_verify_mac(p12, mpass, -1)) { - /* - * May be UTF8 from previous version of OpenSSL: - * convert to a UTF8 form which will translate - * to the same Unicode password. - */ - unsigned char *utmp; - int utmplen; - utmp = OPENSSL_asc2uni(mpass, -1, NULL, &utmplen); - if (utmp == NULL) - goto end; - badpass = OPENSSL_uni2utf8(utmp, utmplen); - OPENSSL_free(utmp); - if (!PKCS12_verify_mac(p12, badpass, -1)) { - BIO_printf(bio_err, "Mac verify error: invalid password?\n"); - ERR_print_errors(bio_err); - goto end; - } else { - BIO_printf(bio_err, "Warning: using broken algorithm\n"); - if (!twopass) - cpass = badpass; - } - } - } - - assert(private); - if (!dump_certs_keys_p12(out, p12, cpass, -1, options, passout, enc)) { - BIO_printf(bio_err, "Error outputting keys and certificates\n"); - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - end: - PKCS12_free(p12); - release_engine(e); - BIO_free(in); - BIO_free_all(out); - sk_OPENSSL_STRING_free(canames); - OPENSSL_free(badpass); - OPENSSL_free(passin); - OPENSSL_free(passout); - return ret; -} - -int dump_certs_keys_p12(BIO *out, const PKCS12 *p12, const char *pass, - int passlen, int options, char *pempass, - const EVP_CIPHER *enc) -{ - STACK_OF(PKCS7) *asafes = NULL; - STACK_OF(PKCS12_SAFEBAG) *bags; - int i, bagnid; - int ret = 0; - PKCS7 *p7; - - if ((asafes = PKCS12_unpack_authsafes(p12)) == NULL) - return 0; - for (i = 0; i < sk_PKCS7_num(asafes); i++) { - p7 = sk_PKCS7_value(asafes, i); - bagnid = OBJ_obj2nid(p7->type); - if (bagnid == NID_pkcs7_data) { - bags = PKCS12_unpack_p7data(p7); - if (options & INFO) - BIO_printf(bio_err, "PKCS7 Data\n"); - } else if (bagnid == NID_pkcs7_encrypted) { - if (options & INFO) { - BIO_printf(bio_err, "PKCS7 Encrypted data: "); - alg_print(p7->d.encrypted->enc_data->algorithm); - } - bags = PKCS12_unpack_p7encdata(p7, pass, passlen); - } else { - continue; - } - if (!bags) - goto err; - if (!dump_certs_pkeys_bags(out, bags, pass, passlen, - options, pempass, enc)) { - sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); - goto err; - } - sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); - bags = NULL; - } - ret = 1; - - err: - sk_PKCS7_pop_free(asafes, PKCS7_free); - return ret; -} - -int dump_certs_pkeys_bags(BIO *out, const STACK_OF(PKCS12_SAFEBAG) *bags, - const char *pass, int passlen, int options, - char *pempass, const EVP_CIPHER *enc) -{ - int i; - for (i = 0; i < sk_PKCS12_SAFEBAG_num(bags); i++) { - if (!dump_certs_pkeys_bag(out, - sk_PKCS12_SAFEBAG_value(bags, i), - pass, passlen, options, pempass, enc)) - return 0; - } - return 1; -} - -int dump_certs_pkeys_bag(BIO *out, const PKCS12_SAFEBAG *bag, - const char *pass, int passlen, int options, - char *pempass, const EVP_CIPHER *enc) -{ - EVP_PKEY *pkey; - PKCS8_PRIV_KEY_INFO *p8; - const PKCS8_PRIV_KEY_INFO *p8c; - X509 *x509; - const STACK_OF(X509_ATTRIBUTE) *attrs; - int ret = 0; - - attrs = PKCS12_SAFEBAG_get0_attrs(bag); - - switch (PKCS12_SAFEBAG_get_nid(bag)) { - case NID_keyBag: - if (options & INFO) - BIO_printf(bio_err, "Key bag\n"); - if (options & NOKEYS) - return 1; - print_attribs(out, attrs, "Bag Attributes"); - p8c = PKCS12_SAFEBAG_get0_p8inf(bag); - if ((pkey = EVP_PKCS82PKEY(p8c)) == NULL) - return 0; - print_attribs(out, PKCS8_pkey_get0_attrs(p8c), "Key Attributes"); - ret = PEM_write_bio_PrivateKey(out, pkey, enc, NULL, 0, NULL, pempass); - EVP_PKEY_free(pkey); - break; - - case NID_pkcs8ShroudedKeyBag: - if (options & INFO) { - const X509_SIG *tp8; - const X509_ALGOR *tp8alg; - - BIO_printf(bio_err, "Shrouded Keybag: "); - tp8 = PKCS12_SAFEBAG_get0_pkcs8(bag); - X509_SIG_get0(tp8, &tp8alg, NULL); - alg_print(tp8alg); - } - if (options & NOKEYS) - return 1; - print_attribs(out, attrs, "Bag Attributes"); - if ((p8 = PKCS12_decrypt_skey(bag, pass, passlen)) == NULL) - return 0; - if ((pkey = EVP_PKCS82PKEY(p8)) == NULL) { - PKCS8_PRIV_KEY_INFO_free(p8); - return 0; - } - print_attribs(out, PKCS8_pkey_get0_attrs(p8), "Key Attributes"); - PKCS8_PRIV_KEY_INFO_free(p8); - ret = PEM_write_bio_PrivateKey(out, pkey, enc, NULL, 0, NULL, pempass); - EVP_PKEY_free(pkey); - break; - - case NID_certBag: - if (options & INFO) - BIO_printf(bio_err, "Certificate bag\n"); - if (options & NOCERTS) - return 1; - if (PKCS12_SAFEBAG_get0_attr(bag, NID_localKeyID)) { - if (options & CACERTS) - return 1; - } else if (options & CLCERTS) - return 1; - print_attribs(out, attrs, "Bag Attributes"); - if (PKCS12_SAFEBAG_get_bag_nid(bag) != NID_x509Certificate) - return 1; - if ((x509 = PKCS12_SAFEBAG_get1_cert(bag)) == NULL) - return 0; - dump_cert_text(out, x509); - ret = PEM_write_bio_X509(out, x509); - X509_free(x509); - break; - - case NID_safeContentsBag: - if (options & INFO) - BIO_printf(bio_err, "Safe Contents bag\n"); - print_attribs(out, attrs, "Bag Attributes"); - return dump_certs_pkeys_bags(out, PKCS12_SAFEBAG_get0_safes(bag), - pass, passlen, options, pempass, enc); - - default: - BIO_printf(bio_err, "Warning unsupported bag type: "); - i2a_ASN1_OBJECT(bio_err, PKCS12_SAFEBAG_get0_type(bag)); - BIO_printf(bio_err, "\n"); - return 1; - } - return ret; -} - -/* Given a single certificate return a verified chain or NULL if error */ - -static int get_cert_chain(X509 *cert, X509_STORE *store, - STACK_OF(X509) **chain) -{ - X509_STORE_CTX *store_ctx = NULL; - STACK_OF(X509) *chn = NULL; - int i = 0; - - store_ctx = X509_STORE_CTX_new(); - if (store_ctx == NULL) { - i = X509_V_ERR_UNSPECIFIED; - goto end; - } - if (!X509_STORE_CTX_init(store_ctx, store, cert, NULL)) { - i = X509_V_ERR_UNSPECIFIED; - goto end; - } - - - if (X509_verify_cert(store_ctx) > 0) - chn = X509_STORE_CTX_get1_chain(store_ctx); - else if ((i = X509_STORE_CTX_get_error(store_ctx)) == 0) - i = X509_V_ERR_UNSPECIFIED; - -end: - X509_STORE_CTX_free(store_ctx); - *chain = chn; - return i; -} - -static int alg_print(const X509_ALGOR *alg) -{ - int pbenid, aparamtype; - const ASN1_OBJECT *aoid; - const void *aparam; - PBEPARAM *pbe = NULL; - - X509_ALGOR_get0(&aoid, &aparamtype, &aparam, alg); - - pbenid = OBJ_obj2nid(aoid); - - BIO_printf(bio_err, "%s", OBJ_nid2ln(pbenid)); - - /* - * If PBE algorithm is PBES2 decode algorithm parameters - * for additional details. - */ - if (pbenid == NID_pbes2) { - PBE2PARAM *pbe2 = NULL; - int encnid; - if (aparamtype == V_ASN1_SEQUENCE) - pbe2 = ASN1_item_unpack(aparam, ASN1_ITEM_rptr(PBE2PARAM)); - if (pbe2 == NULL) { - BIO_puts(bio_err, ", <unsupported parameters>"); - goto done; - } - X509_ALGOR_get0(&aoid, &aparamtype, &aparam, pbe2->keyfunc); - pbenid = OBJ_obj2nid(aoid); - X509_ALGOR_get0(&aoid, NULL, NULL, pbe2->encryption); - encnid = OBJ_obj2nid(aoid); - BIO_printf(bio_err, ", %s, %s", OBJ_nid2ln(pbenid), - OBJ_nid2sn(encnid)); - /* If KDF is PBKDF2 decode parameters */ - if (pbenid == NID_id_pbkdf2) { - PBKDF2PARAM *kdf = NULL; - int prfnid; - if (aparamtype == V_ASN1_SEQUENCE) - kdf = ASN1_item_unpack(aparam, ASN1_ITEM_rptr(PBKDF2PARAM)); - if (kdf == NULL) { - BIO_puts(bio_err, ", <unsupported parameters>"); - goto done; - } - - if (kdf->prf == NULL) { - prfnid = NID_hmacWithSHA1; - } else { - X509_ALGOR_get0(&aoid, NULL, NULL, kdf->prf); - prfnid = OBJ_obj2nid(aoid); - } - BIO_printf(bio_err, ", Iteration %ld, PRF %s", - ASN1_INTEGER_get(kdf->iter), OBJ_nid2sn(prfnid)); - PBKDF2PARAM_free(kdf); -#ifndef OPENSSL_NO_SCRYPT - } else if (pbenid == NID_id_scrypt) { - SCRYPT_PARAMS *kdf = NULL; - - if (aparamtype == V_ASN1_SEQUENCE) - kdf = ASN1_item_unpack(aparam, ASN1_ITEM_rptr(SCRYPT_PARAMS)); - if (kdf == NULL) { - BIO_puts(bio_err, ", <unsupported parameters>"); - goto done; - } - BIO_printf(bio_err, ", Salt length: %d, Cost(N): %ld, " - "Block size(r): %ld, Parallelism(p): %ld", - ASN1_STRING_length(kdf->salt), - ASN1_INTEGER_get(kdf->costParameter), - ASN1_INTEGER_get(kdf->blockSize), - ASN1_INTEGER_get(kdf->parallelizationParameter)); - SCRYPT_PARAMS_free(kdf); -#endif - } - PBE2PARAM_free(pbe2); - } else { - if (aparamtype == V_ASN1_SEQUENCE) - pbe = ASN1_item_unpack(aparam, ASN1_ITEM_rptr(PBEPARAM)); - if (pbe == NULL) { - BIO_puts(bio_err, ", <unsupported parameters>"); - goto done; - } - BIO_printf(bio_err, ", Iteration %ld", ASN1_INTEGER_get(pbe->iter)); - PBEPARAM_free(pbe); - } - done: - BIO_puts(bio_err, "\n"); - return 1; -} - -/* Load all certificates from a given file */ - -int cert_load(BIO *in, STACK_OF(X509) *sk) -{ - int ret; - X509 *cert; - ret = 0; - while ((cert = PEM_read_bio_X509(in, NULL, NULL, NULL))) { - ret = 1; - sk_X509_push(sk, cert); - } - if (ret) - ERR_clear_error(); - return ret; -} - -/* Generalised x509 attribute value print */ - -void print_attribute(BIO *out, const ASN1_TYPE *av) -{ - char *value; - - switch (av->type) { - case V_ASN1_BMPSTRING: - value = OPENSSL_uni2asc(av->value.bmpstring->data, - av->value.bmpstring->length); - BIO_printf(out, "%s\n", value); - OPENSSL_free(value); - break; - - case V_ASN1_OCTET_STRING: - hex_prin(out, av->value.octet_string->data, - av->value.octet_string->length); - BIO_printf(out, "\n"); - break; - - case V_ASN1_BIT_STRING: - hex_prin(out, av->value.bit_string->data, - av->value.bit_string->length); - BIO_printf(out, "\n"); - break; - - default: - BIO_printf(out, "<Unsupported tag %d>\n", av->type); - break; - } -} - -/* Generalised attribute print: handle PKCS#8 and bag attributes */ - -int print_attribs(BIO *out, const STACK_OF(X509_ATTRIBUTE) *attrlst, - const char *name) -{ - X509_ATTRIBUTE *attr; - ASN1_TYPE *av; - int i, j, attr_nid; - if (!attrlst) { - BIO_printf(out, "%s: <No Attributes>\n", name); - return 1; - } - if (!sk_X509_ATTRIBUTE_num(attrlst)) { - BIO_printf(out, "%s: <Empty Attributes>\n", name); - return 1; - } - BIO_printf(out, "%s\n", name); - for (i = 0; i < sk_X509_ATTRIBUTE_num(attrlst); i++) { - ASN1_OBJECT *attr_obj; - attr = sk_X509_ATTRIBUTE_value(attrlst, i); - attr_obj = X509_ATTRIBUTE_get0_object(attr); - attr_nid = OBJ_obj2nid(attr_obj); - BIO_printf(out, " "); - if (attr_nid == NID_undef) { - i2a_ASN1_OBJECT(out, attr_obj); - BIO_printf(out, ": "); - } else { - BIO_printf(out, "%s: ", OBJ_nid2ln(attr_nid)); - } - - if (X509_ATTRIBUTE_count(attr)) { - for (j = 0; j < X509_ATTRIBUTE_count(attr); j++) - { - av = X509_ATTRIBUTE_get0_type(attr, j); - print_attribute(out, av); - } - } else { - BIO_printf(out, "<No Values>\n"); - } - } - return 1; -} - -void hex_prin(BIO *out, unsigned char *buf, int len) -{ - int i; - for (i = 0; i < len; i++) - BIO_printf(out, "%02X ", buf[i]); -} - -static int set_pbe(int *ppbe, const char *str) -{ - if (!str) - return 0; - if (strcmp(str, "NONE") == 0) { - *ppbe = -1; - return 1; - } - *ppbe = OBJ_txt2nid(str); - if (*ppbe == NID_undef) { - BIO_printf(bio_err, "Unknown PBE algorithm %s\n", str); - return 0; - } - return 1; -} diff --git a/contrib/libs/openssl/apps/pkcs7.c b/contrib/libs/openssl/apps/pkcs7.c deleted file mode 100644 index c3e9f5c692..0000000000 --- a/contrib/libs/openssl/apps/pkcs7.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include "apps.h" -#include "progs.h" -#include <openssl/err.h> -#include <openssl/objects.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pkcs7.h> -#include <openssl/pem.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_NOOUT, - OPT_TEXT, OPT_PRINT, OPT_PRINT_CERTS, OPT_ENGINE -} OPTION_CHOICE; - -const OPTIONS pkcs7_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format - DER or PEM"}, - {"in", OPT_IN, '<', "Input file"}, - {"outform", OPT_OUTFORM, 'F', "Output format - DER or PEM"}, - {"out", OPT_OUT, '>', "Output file"}, - {"noout", OPT_NOOUT, '-', "Don't output encoded data"}, - {"text", OPT_TEXT, '-', "Print full details of certificates"}, - {"print", OPT_PRINT, '-', "Print out all fields of the PKCS7 structure"}, - {"print_certs", OPT_PRINT_CERTS, '-', - "Print_certs print any certs or crl in the input"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int pkcs7_main(int argc, char **argv) -{ - ENGINE *e = NULL; - PKCS7 *p7 = NULL; - BIO *in = NULL, *out = NULL; - int informat = FORMAT_PEM, outformat = FORMAT_PEM; - char *infile = NULL, *outfile = NULL, *prog; - int i, print_certs = 0, text = 0, noout = 0, p7_print = 0, ret = 1; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, pkcs7_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(pkcs7_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_PRINT: - p7_print = 1; - break; - case OPT_PRINT_CERTS: - print_certs = 1; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - - if (informat == FORMAT_ASN1) - p7 = d2i_PKCS7_bio(in, NULL); - else - p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL); - if (p7 == NULL) { - BIO_printf(bio_err, "unable to load PKCS7 object\n"); - ERR_print_errors(bio_err); - goto end; - } - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if (p7_print) - PKCS7_print_ctx(out, p7, 0, NULL); - - if (print_certs) { - STACK_OF(X509) *certs = NULL; - STACK_OF(X509_CRL) *crls = NULL; - - i = OBJ_obj2nid(p7->type); - switch (i) { - case NID_pkcs7_signed: - if (p7->d.sign != NULL) { - certs = p7->d.sign->cert; - crls = p7->d.sign->crl; - } - break; - case NID_pkcs7_signedAndEnveloped: - if (p7->d.signed_and_enveloped != NULL) { - certs = p7->d.signed_and_enveloped->cert; - crls = p7->d.signed_and_enveloped->crl; - } - break; - default: - break; - } - - if (certs != NULL) { - X509 *x; - - for (i = 0; i < sk_X509_num(certs); i++) { - x = sk_X509_value(certs, i); - if (text) - X509_print(out, x); - else - dump_cert_text(out, x); - - if (!noout) - PEM_write_bio_X509(out, x); - BIO_puts(out, "\n"); - } - } - if (crls != NULL) { - X509_CRL *crl; - - for (i = 0; i < sk_X509_CRL_num(crls); i++) { - crl = sk_X509_CRL_value(crls, i); - - X509_CRL_print_ex(out, crl, get_nameopt()); - - if (!noout) - PEM_write_bio_X509_CRL(out, crl); - BIO_puts(out, "\n"); - } - } - - ret = 0; - goto end; - } - - if (!noout) { - if (outformat == FORMAT_ASN1) - i = i2d_PKCS7_bio(out, p7); - else - i = PEM_write_bio_PKCS7(out, p7); - - if (!i) { - BIO_printf(bio_err, "unable to write pkcs7 object\n"); - ERR_print_errors(bio_err); - goto end; - } - } - ret = 0; - end: - PKCS7_free(p7); - release_engine(e); - BIO_free(in); - BIO_free_all(out); - return ret; -} diff --git a/contrib/libs/openssl/apps/pkcs8.c b/contrib/libs/openssl/apps/pkcs8.c deleted file mode 100644 index 205536560a..0000000000 --- a/contrib/libs/openssl/apps/pkcs8.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/pem.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/pkcs12.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_ENGINE, OPT_IN, OPT_OUT, - OPT_TOPK8, OPT_NOITER, OPT_NOCRYPT, -#ifndef OPENSSL_NO_SCRYPT - OPT_SCRYPT, OPT_SCRYPT_N, OPT_SCRYPT_R, OPT_SCRYPT_P, -#endif - OPT_V2, OPT_V1, OPT_V2PRF, OPT_ITER, OPT_PASSIN, OPT_PASSOUT, - OPT_TRADITIONAL, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS pkcs8_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format (DER or PEM)"}, - {"outform", OPT_OUTFORM, 'F', "Output format (DER or PEM)"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"topk8", OPT_TOPK8, '-', "Output PKCS8 file"}, - {"noiter", OPT_NOITER, '-', "Use 1 as iteration count"}, - {"nocrypt", OPT_NOCRYPT, '-', "Use or expect unencrypted private key"}, - OPT_R_OPTIONS, - {"v2", OPT_V2, 's', "Use PKCS#5 v2.0 and cipher"}, - {"v1", OPT_V1, 's', "Use PKCS#5 v1.5 and cipher"}, - {"v2prf", OPT_V2PRF, 's', "Set the PRF algorithm to use with PKCS#5 v2.0"}, - {"iter", OPT_ITER, 'p', "Specify the iteration count"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"traditional", OPT_TRADITIONAL, '-', "use traditional format private key"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif -#ifndef OPENSSL_NO_SCRYPT - {"scrypt", OPT_SCRYPT, '-', "Use scrypt algorithm"}, - {"scrypt_N", OPT_SCRYPT_N, 's', "Set scrypt N parameter"}, - {"scrypt_r", OPT_SCRYPT_R, 's', "Set scrypt r parameter"}, - {"scrypt_p", OPT_SCRYPT_P, 's', "Set scrypt p parameter"}, -#endif - {NULL} -}; - -int pkcs8_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL; - EVP_PKEY *pkey = NULL; - PKCS8_PRIV_KEY_INFO *p8inf = NULL; - X509_SIG *p8 = NULL; - const EVP_CIPHER *cipher = NULL; - char *infile = NULL, *outfile = NULL; - char *passinarg = NULL, *passoutarg = NULL, *prog; -#ifndef OPENSSL_NO_UI_CONSOLE - char pass[APP_PASS_LEN]; -#endif - char *passin = NULL, *passout = NULL, *p8pass = NULL; - OPTION_CHOICE o; - int nocrypt = 0, ret = 1, iter = PKCS12_DEFAULT_ITER; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, topk8 = 0, pbe_nid = -1; - int private = 0, traditional = 0; -#ifndef OPENSSL_NO_SCRYPT - long scrypt_N = 0, scrypt_r = 0, scrypt_p = 0; -#endif - - prog = opt_init(argc, argv, pkcs8_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(pkcs8_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_TOPK8: - topk8 = 1; - break; - case OPT_NOITER: - iter = 1; - break; - case OPT_NOCRYPT: - nocrypt = 1; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_TRADITIONAL: - traditional = 1; - break; - case OPT_V2: - if (!opt_cipher(opt_arg(), &cipher)) - goto opthelp; - break; - case OPT_V1: - pbe_nid = OBJ_txt2nid(opt_arg()); - if (pbe_nid == NID_undef) { - BIO_printf(bio_err, - "%s: Unknown PBE algorithm %s\n", prog, opt_arg()); - goto opthelp; - } - break; - case OPT_V2PRF: - pbe_nid = OBJ_txt2nid(opt_arg()); - if (!EVP_PBE_find(EVP_PBE_TYPE_PRF, pbe_nid, NULL, NULL, 0)) { - BIO_printf(bio_err, - "%s: Unknown PRF algorithm %s\n", prog, opt_arg()); - goto opthelp; - } - if (cipher == NULL) - cipher = EVP_aes_256_cbc(); - break; - case OPT_ITER: - if (!opt_int(opt_arg(), &iter)) - goto opthelp; - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; -#ifndef OPENSSL_NO_SCRYPT - case OPT_SCRYPT: - scrypt_N = 16384; - scrypt_r = 8; - scrypt_p = 1; - if (cipher == NULL) - cipher = EVP_aes_256_cbc(); - break; - case OPT_SCRYPT_N: - if (!opt_long(opt_arg(), &scrypt_N) || scrypt_N <= 0) - goto opthelp; - break; - case OPT_SCRYPT_R: - if (!opt_long(opt_arg(), &scrypt_r) || scrypt_r <= 0) - goto opthelp; - break; - case OPT_SCRYPT_P: - if (!opt_long(opt_arg(), &scrypt_p) || scrypt_p <= 0) - goto opthelp; - break; -#endif - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = 1; - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - if ((pbe_nid == -1) && cipher == NULL) - cipher = EVP_aes_256_cbc(); - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - if (topk8) { - pkey = load_key(infile, informat, 1, passin, e, "key"); - if (pkey == NULL) - goto end; - if ((p8inf = EVP_PKEY2PKCS8(pkey)) == NULL) { - BIO_printf(bio_err, "Error converting key\n"); - ERR_print_errors(bio_err); - goto end; - } - if (nocrypt) { - assert(private); - if (outformat == FORMAT_PEM) { - PEM_write_bio_PKCS8_PRIV_KEY_INFO(out, p8inf); - } else if (outformat == FORMAT_ASN1) { - i2d_PKCS8_PRIV_KEY_INFO_bio(out, p8inf); - } else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - } else { - X509_ALGOR *pbe; - if (cipher) { -#ifndef OPENSSL_NO_SCRYPT - if (scrypt_N && scrypt_r && scrypt_p) - pbe = PKCS5_pbe2_set_scrypt(cipher, NULL, 0, NULL, - scrypt_N, scrypt_r, scrypt_p); - else -#endif - pbe = PKCS5_pbe2_set_iv(cipher, iter, NULL, 0, NULL, - pbe_nid); - } else { - pbe = PKCS5_pbe_set(pbe_nid, iter, NULL, 0); - } - if (pbe == NULL) { - BIO_printf(bio_err, "Error setting PBE algorithm\n"); - ERR_print_errors(bio_err); - goto end; - } - if (passout != NULL) { - p8pass = passout; - } else if (1) { - /* To avoid bit rot */ -#ifndef OPENSSL_NO_UI_CONSOLE - p8pass = pass; - if (EVP_read_pw_string - (pass, sizeof(pass), "Enter Encryption Password:", 1)) { - X509_ALGOR_free(pbe); - goto end; - } - } else { -#endif - BIO_printf(bio_err, "Password required\n"); - goto end; - } - p8 = PKCS8_set0_pbe(p8pass, strlen(p8pass), p8inf, pbe); - if (p8 == NULL) { - X509_ALGOR_free(pbe); - BIO_printf(bio_err, "Error encrypting key\n"); - ERR_print_errors(bio_err); - goto end; - } - assert(private); - if (outformat == FORMAT_PEM) - PEM_write_bio_PKCS8(out, p8); - else if (outformat == FORMAT_ASN1) - i2d_PKCS8_bio(out, p8); - else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - } - - ret = 0; - goto end; - } - - if (nocrypt) { - if (informat == FORMAT_PEM) { - p8inf = PEM_read_bio_PKCS8_PRIV_KEY_INFO(in, NULL, NULL, NULL); - } else if (informat == FORMAT_ASN1) { - p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(in, NULL); - } else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - } else { - if (informat == FORMAT_PEM) { - p8 = PEM_read_bio_PKCS8(in, NULL, NULL, NULL); - } else if (informat == FORMAT_ASN1) { - p8 = d2i_PKCS8_bio(in, NULL); - } else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - - if (p8 == NULL) { - BIO_printf(bio_err, "Error reading key\n"); - ERR_print_errors(bio_err); - goto end; - } - if (passin != NULL) { - p8pass = passin; - } else if (1) { -#ifndef OPENSSL_NO_UI_CONSOLE - p8pass = pass; - if (EVP_read_pw_string(pass, sizeof(pass), "Enter Password:", 0)) { - BIO_printf(bio_err, "Can't read Password\n"); - goto end; - } - } else { -#endif - BIO_printf(bio_err, "Password required\n"); - goto end; - } - p8inf = PKCS8_decrypt(p8, p8pass, strlen(p8pass)); - } - - if (p8inf == NULL) { - BIO_printf(bio_err, "Error decrypting key\n"); - ERR_print_errors(bio_err); - goto end; - } - - if ((pkey = EVP_PKCS82PKEY(p8inf)) == NULL) { - BIO_printf(bio_err, "Error converting key\n"); - ERR_print_errors(bio_err); - goto end; - } - - assert(private); - if (outformat == FORMAT_PEM) { - if (traditional) - PEM_write_bio_PrivateKey_traditional(out, pkey, NULL, NULL, 0, - NULL, passout); - else - PEM_write_bio_PrivateKey(out, pkey, NULL, NULL, 0, NULL, passout); - } else if (outformat == FORMAT_ASN1) { - i2d_PrivateKey_bio(out, pkey); - } else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - ret = 0; - - end: - X509_SIG_free(p8); - PKCS8_PRIV_KEY_INFO_free(p8inf); - EVP_PKEY_free(pkey); - release_engine(e); - BIO_free_all(out); - BIO_free(in); - OPENSSL_free(passin); - OPENSSL_free(passout); - - return ret; -} diff --git a/contrib/libs/openssl/apps/pkey.c b/contrib/libs/openssl/apps/pkey.c deleted file mode 100644 index 0dd5590bdc..0000000000 --- a/contrib/libs/openssl/apps/pkey.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/pem.h> -#include <openssl/err.h> -#include <openssl/evp.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_PASSIN, OPT_PASSOUT, OPT_ENGINE, - OPT_IN, OPT_OUT, OPT_PUBIN, OPT_PUBOUT, OPT_TEXT_PUB, - OPT_TEXT, OPT_NOOUT, OPT_MD, OPT_TRADITIONAL, OPT_CHECK, OPT_PUB_CHECK -} OPTION_CHOICE; - -const OPTIONS pkey_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'f', "Input format (DER or PEM)"}, - {"outform", OPT_OUTFORM, 'F', "Output format (DER or PEM)"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"in", OPT_IN, 's', "Input key"}, - {"out", OPT_OUT, '>', "Output file"}, - {"pubin", OPT_PUBIN, '-', - "Read public key from input (default is private key)"}, - {"pubout", OPT_PUBOUT, '-', "Output public key, not private"}, - {"text_pub", OPT_TEXT_PUB, '-', "Only output public key components"}, - {"text", OPT_TEXT, '-', "Output in plaintext as well"}, - {"noout", OPT_NOOUT, '-', "Don't output the key"}, - {"", OPT_MD, '-', "Any supported cipher"}, - {"traditional", OPT_TRADITIONAL, '-', - "Use traditional format for private keys"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"check", OPT_CHECK, '-', "Check key consistency"}, - {"pubcheck", OPT_PUB_CHECK, '-', "Check public key consistency"}, - {NULL} -}; - -int pkey_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL; - EVP_PKEY *pkey = NULL; - const EVP_CIPHER *cipher = NULL; - char *infile = NULL, *outfile = NULL, *passin = NULL, *passout = NULL; - char *passinarg = NULL, *passoutarg = NULL, *prog; - OPTION_CHOICE o; - int informat = FORMAT_PEM, outformat = FORMAT_PEM; - int pubin = 0, pubout = 0, pubtext = 0, text = 0, noout = 0, ret = 1; - int private = 0, traditional = 0, check = 0, pub_check = 0; - - prog = opt_init(argc, argv, pkey_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(pkey_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PUBIN: - pubin = pubout = pubtext = 1; - break; - case OPT_PUBOUT: - pubout = 1; - break; - case OPT_TEXT_PUB: - pubtext = text = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_TRADITIONAL: - traditional = 1; - break; - case OPT_CHECK: - check = 1; - break; - case OPT_PUB_CHECK: - pub_check = 1; - break; - case OPT_MD: - if (!opt_cipher(opt_unknown(), &cipher)) - goto opthelp; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = !noout && !pubout ? 1 : 0; - if (text && !pubtext) - private = 1; - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - if (pubin) - pkey = load_pubkey(infile, informat, 1, passin, e, "Public Key"); - else - pkey = load_key(infile, informat, 1, passin, e, "key"); - if (pkey == NULL) - goto end; - - if (check || pub_check) { - int r; - EVP_PKEY_CTX *ctx; - - ctx = EVP_PKEY_CTX_new(pkey, e); - if (ctx == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - if (check) - r = EVP_PKEY_check(ctx); - else - r = EVP_PKEY_public_check(ctx); - - if (r == 1) { - BIO_printf(out, "Key is valid\n"); - } else { - /* - * Note: at least for RSA keys if this function returns - * -1, there will be no error reasons. - */ - unsigned long err; - - BIO_printf(out, "Key is invalid\n"); - - while ((err = ERR_peek_error()) != 0) { - BIO_printf(out, "Detailed error: %s\n", - ERR_reason_error_string(err)); - ERR_get_error(); /* remove err from error stack */ - } - } - EVP_PKEY_CTX_free(ctx); - } - - if (!noout) { - if (outformat == FORMAT_PEM) { - if (pubout) { - if (!PEM_write_bio_PUBKEY(out, pkey)) - goto end; - } else { - assert(private); - if (traditional) { - if (!PEM_write_bio_PrivateKey_traditional(out, pkey, cipher, - NULL, 0, NULL, - passout)) - goto end; - } else { - if (!PEM_write_bio_PrivateKey(out, pkey, cipher, - NULL, 0, NULL, passout)) - goto end; - } - } - } else if (outformat == FORMAT_ASN1) { - if (pubout) { - if (!i2d_PUBKEY_bio(out, pkey)) - goto end; - } else { - assert(private); - if (!i2d_PrivateKey_bio(out, pkey)) - goto end; - } - } else { - BIO_printf(bio_err, "Bad format specified for key\n"); - goto end; - } - } - - if (text) { - if (pubtext) { - if (EVP_PKEY_print_public(out, pkey, 0, NULL) <= 0) - goto end; - } else { - assert(private); - if (EVP_PKEY_print_private(out, pkey, 0, NULL) <= 0) - goto end; - } - } - - ret = 0; - - end: - if (ret != 0) - ERR_print_errors(bio_err); - EVP_PKEY_free(pkey); - release_engine(e); - BIO_free_all(out); - BIO_free(in); - OPENSSL_free(passin); - OPENSSL_free(passout); - - return ret; -} diff --git a/contrib/libs/openssl/apps/pkeyparam.c b/contrib/libs/openssl/apps/pkeyparam.c deleted file mode 100644 index 41c3f532b3..0000000000 --- a/contrib/libs/openssl/apps/pkeyparam.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/pem.h> -#include <openssl/err.h> -#include <openssl/evp.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_IN, OPT_OUT, OPT_TEXT, OPT_NOOUT, - OPT_ENGINE, OPT_CHECK -} OPTION_CHOICE; - -const OPTIONS pkeyparam_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"text", OPT_TEXT, '-', "Print parameters as text"}, - {"noout", OPT_NOOUT, '-', "Don't output encoded parameters"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"check", OPT_CHECK, '-', "Check key param consistency"}, - {NULL} -}; - -int pkeyparam_main(int argc, char **argv) -{ - ENGINE *e = NULL; - BIO *in = NULL, *out = NULL; - EVP_PKEY *pkey = NULL; - int text = 0, noout = 0, ret = 1, check = 0; - OPTION_CHOICE o; - char *infile = NULL, *outfile = NULL, *prog; - - prog = opt_init(argc, argv, pkeyparam_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(pkeyparam_options); - ret = 0; - goto end; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_TEXT: - text = 1; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_CHECK: - check = 1; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - in = bio_open_default(infile, 'r', FORMAT_PEM); - if (in == NULL) - goto end; - out = bio_open_default(outfile, 'w', FORMAT_PEM); - if (out == NULL) - goto end; - pkey = PEM_read_bio_Parameters(in, NULL); - if (pkey == NULL) { - BIO_printf(bio_err, "Error reading parameters\n"); - ERR_print_errors(bio_err); - goto end; - } - - if (check) { - int r; - EVP_PKEY_CTX *ctx; - - ctx = EVP_PKEY_CTX_new(pkey, e); - if (ctx == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - r = EVP_PKEY_param_check(ctx); - - if (r == 1) { - BIO_printf(out, "Parameters are valid\n"); - } else { - /* - * Note: at least for RSA keys if this function returns - * -1, there will be no error reasons. - */ - unsigned long err; - - BIO_printf(out, "Parameters are invalid\n"); - - while ((err = ERR_peek_error()) != 0) { - BIO_printf(out, "Detailed error: %s\n", - ERR_reason_error_string(err)); - ERR_get_error(); /* remove err from error stack */ - } - } - EVP_PKEY_CTX_free(ctx); - } - - if (!noout) - PEM_write_bio_Parameters(out, pkey); - - if (text) - EVP_PKEY_print_params(out, pkey, 0, NULL); - - ret = 0; - - end: - EVP_PKEY_free(pkey); - release_engine(e); - BIO_free_all(out); - BIO_free(in); - - return ret; -} diff --git a/contrib/libs/openssl/apps/pkeyutl.c b/contrib/libs/openssl/apps/pkeyutl.c deleted file mode 100644 index 831e14dab4..0000000000 --- a/contrib/libs/openssl/apps/pkeyutl.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "apps.h" -#include "progs.h" -#include <string.h> -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/evp.h> - -#define KEY_NONE 0 -#define KEY_PRIVKEY 1 -#define KEY_PUBKEY 2 -#define KEY_CERT 3 - -static EVP_PKEY_CTX *init_ctx(const char *kdfalg, int *pkeysize, - const char *keyfile, int keyform, int key_type, - char *passinarg, int pkey_op, ENGINE *e, - const int impl); - -static int setup_peer(EVP_PKEY_CTX *ctx, int peerform, const char *file, - ENGINE *e); - -static int do_keyop(EVP_PKEY_CTX *ctx, int pkey_op, - unsigned char *out, size_t *poutlen, - const unsigned char *in, size_t inlen); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENGINE, OPT_ENGINE_IMPL, OPT_IN, OPT_OUT, - OPT_PUBIN, OPT_CERTIN, OPT_ASN1PARSE, OPT_HEXDUMP, OPT_SIGN, - OPT_VERIFY, OPT_VERIFYRECOVER, OPT_REV, OPT_ENCRYPT, OPT_DECRYPT, - OPT_DERIVE, OPT_SIGFILE, OPT_INKEY, OPT_PEERKEY, OPT_PASSIN, - OPT_PEERFORM, OPT_KEYFORM, OPT_PKEYOPT, OPT_KDF, OPT_KDFLEN, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS pkeyutl_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, '<', "Input file - default stdin"}, - {"out", OPT_OUT, '>', "Output file - default stdout"}, - {"pubin", OPT_PUBIN, '-', "Input is a public key"}, - {"certin", OPT_CERTIN, '-', "Input is a cert with a public key"}, - {"asn1parse", OPT_ASN1PARSE, '-', "asn1parse the output data"}, - {"hexdump", OPT_HEXDUMP, '-', "Hex dump output"}, - {"sign", OPT_SIGN, '-', "Sign input data with private key"}, - {"verify", OPT_VERIFY, '-', "Verify with public key"}, - {"verifyrecover", OPT_VERIFYRECOVER, '-', - "Verify with public key, recover original data"}, - {"rev", OPT_REV, '-', "Reverse the order of the input buffer"}, - {"encrypt", OPT_ENCRYPT, '-', "Encrypt input data with public key"}, - {"decrypt", OPT_DECRYPT, '-', "Decrypt input data with private key"}, - {"derive", OPT_DERIVE, '-', "Derive shared secret"}, - {"kdf", OPT_KDF, 's', "Use KDF algorithm"}, - {"kdflen", OPT_KDFLEN, 'p', "KDF algorithm output length"}, - {"sigfile", OPT_SIGFILE, '<', "Signature file (verify operation only)"}, - {"inkey", OPT_INKEY, 's', "Input private key file"}, - {"peerkey", OPT_PEERKEY, 's', "Peer key file used in key derivation"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"peerform", OPT_PEERFORM, 'E', "Peer key format - default PEM"}, - {"keyform", OPT_KEYFORM, 'E', "Private key format - default PEM"}, - {"pkeyopt", OPT_PKEYOPT, 's', "Public key options as opt:value"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, - {"engine_impl", OPT_ENGINE_IMPL, '-', - "Also use engine given by -engine for crypto operations"}, -#endif - {NULL} -}; - -int pkeyutl_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL; - EVP_PKEY_CTX *ctx = NULL; - char *infile = NULL, *outfile = NULL, *sigfile = NULL, *passinarg = NULL; - char hexdump = 0, asn1parse = 0, rev = 0, *prog; - unsigned char *buf_in = NULL, *buf_out = NULL, *sig = NULL; - OPTION_CHOICE o; - int buf_inlen = 0, siglen = -1, keyform = FORMAT_PEM, peerform = FORMAT_PEM; - int keysize = -1, pkey_op = EVP_PKEY_OP_SIGN, key_type = KEY_PRIVKEY; - int engine_impl = 0; - int ret = 1, rv = -1; - size_t buf_outlen; - const char *inkey = NULL; - const char *peerkey = NULL; - const char *kdfalg = NULL; - int kdflen = 0; - STACK_OF(OPENSSL_STRING) *pkeyopts = NULL; - - prog = opt_init(argc, argv, pkeyutl_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(pkeyutl_options); - ret = 0; - goto end; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_SIGFILE: - sigfile = opt_arg(); - break; - case OPT_ENGINE_IMPL: - engine_impl = 1; - break; - case OPT_INKEY: - inkey = opt_arg(); - break; - case OPT_PEERKEY: - peerkey = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PEERFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDE, &peerform)) - goto opthelp; - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDE, &keyform)) - goto opthelp; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_PUBIN: - key_type = KEY_PUBKEY; - break; - case OPT_CERTIN: - key_type = KEY_CERT; - break; - case OPT_ASN1PARSE: - asn1parse = 1; - break; - case OPT_HEXDUMP: - hexdump = 1; - break; - case OPT_SIGN: - pkey_op = EVP_PKEY_OP_SIGN; - break; - case OPT_VERIFY: - pkey_op = EVP_PKEY_OP_VERIFY; - break; - case OPT_VERIFYRECOVER: - pkey_op = EVP_PKEY_OP_VERIFYRECOVER; - break; - case OPT_ENCRYPT: - pkey_op = EVP_PKEY_OP_ENCRYPT; - break; - case OPT_DECRYPT: - pkey_op = EVP_PKEY_OP_DECRYPT; - break; - case OPT_DERIVE: - pkey_op = EVP_PKEY_OP_DERIVE; - break; - case OPT_KDF: - pkey_op = EVP_PKEY_OP_DERIVE; - key_type = KEY_NONE; - kdfalg = opt_arg(); - break; - case OPT_KDFLEN: - kdflen = atoi(opt_arg()); - break; - case OPT_REV: - rev = 1; - break; - case OPT_PKEYOPT: - if ((pkeyopts == NULL && - (pkeyopts = sk_OPENSSL_STRING_new_null()) == NULL) || - sk_OPENSSL_STRING_push(pkeyopts, opt_arg()) == 0) { - BIO_puts(bio_err, "out of memory\n"); - goto end; - } - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (kdfalg != NULL) { - if (kdflen == 0) { - BIO_printf(bio_err, - "%s: no KDF length given (-kdflen parameter).\n", prog); - goto opthelp; - } - } else if (inkey == NULL) { - BIO_printf(bio_err, - "%s: no private key given (-inkey parameter).\n", prog); - goto opthelp; - } else if (peerkey != NULL && pkey_op != EVP_PKEY_OP_DERIVE) { - BIO_printf(bio_err, - "%s: no peer key given (-peerkey parameter).\n", prog); - goto opthelp; - } - ctx = init_ctx(kdfalg, &keysize, inkey, keyform, key_type, - passinarg, pkey_op, e, engine_impl); - if (ctx == NULL) { - BIO_printf(bio_err, "%s: Error initializing context\n", prog); - ERR_print_errors(bio_err); - goto end; - } - if (peerkey != NULL && !setup_peer(ctx, peerform, peerkey, e)) { - BIO_printf(bio_err, "%s: Error setting up peer key\n", prog); - ERR_print_errors(bio_err); - goto end; - } - if (pkeyopts != NULL) { - int num = sk_OPENSSL_STRING_num(pkeyopts); - int i; - - for (i = 0; i < num; ++i) { - const char *opt = sk_OPENSSL_STRING_value(pkeyopts, i); - - if (pkey_ctrl_string(ctx, opt) <= 0) { - BIO_printf(bio_err, "%s: Can't set parameter \"%s\":\n", - prog, opt); - ERR_print_errors(bio_err); - goto end; - } - } - } - - if (sigfile != NULL && (pkey_op != EVP_PKEY_OP_VERIFY)) { - BIO_printf(bio_err, - "%s: Signature file specified for non verify\n", prog); - goto end; - } - - if (sigfile == NULL && (pkey_op == EVP_PKEY_OP_VERIFY)) { - BIO_printf(bio_err, - "%s: No signature file specified for verify\n", prog); - goto end; - } - - if (pkey_op != EVP_PKEY_OP_DERIVE) { - in = bio_open_default(infile, 'r', FORMAT_BINARY); - if (in == NULL) - goto end; - } - out = bio_open_default(outfile, 'w', FORMAT_BINARY); - if (out == NULL) - goto end; - - if (sigfile != NULL) { - BIO *sigbio = BIO_new_file(sigfile, "rb"); - - if (sigbio == NULL) { - BIO_printf(bio_err, "Can't open signature file %s\n", sigfile); - goto end; - } - siglen = bio_to_mem(&sig, keysize * 10, sigbio); - BIO_free(sigbio); - if (siglen < 0) { - BIO_printf(bio_err, "Error reading signature data\n"); - goto end; - } - } - - if (in != NULL) { - /* Read the input data */ - buf_inlen = bio_to_mem(&buf_in, keysize * 10, in); - if (buf_inlen < 0) { - BIO_printf(bio_err, "Error reading input Data\n"); - goto end; - } - if (rev) { - size_t i; - unsigned char ctmp; - size_t l = (size_t)buf_inlen; - for (i = 0; i < l / 2; i++) { - ctmp = buf_in[i]; - buf_in[i] = buf_in[l - 1 - i]; - buf_in[l - 1 - i] = ctmp; - } - } - } - - /* Sanity check the input */ - if (buf_inlen > EVP_MAX_MD_SIZE - && (pkey_op == EVP_PKEY_OP_SIGN - || pkey_op == EVP_PKEY_OP_VERIFY)) { - BIO_printf(bio_err, - "Error: The input data looks too long to be a hash\n"); - goto end; - } - - if (pkey_op == EVP_PKEY_OP_VERIFY) { - rv = EVP_PKEY_verify(ctx, sig, (size_t)siglen, - buf_in, (size_t)buf_inlen); - if (rv == 1) { - BIO_puts(out, "Signature Verified Successfully\n"); - ret = 0; - } else { - BIO_puts(out, "Signature Verification Failure\n"); - } - goto end; - } - if (kdflen != 0) { - buf_outlen = kdflen; - rv = 1; - } else { - rv = do_keyop(ctx, pkey_op, NULL, (size_t *)&buf_outlen, - buf_in, (size_t)buf_inlen); - } - if (rv > 0 && buf_outlen != 0) { - buf_out = app_malloc(buf_outlen, "buffer output"); - rv = do_keyop(ctx, pkey_op, - buf_out, (size_t *)&buf_outlen, - buf_in, (size_t)buf_inlen); - } - if (rv <= 0) { - if (pkey_op != EVP_PKEY_OP_DERIVE) { - BIO_puts(bio_err, "Public Key operation error\n"); - } else { - BIO_puts(bio_err, "Key derivation failed\n"); - } - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - - if (asn1parse) { - if (!ASN1_parse_dump(out, buf_out, buf_outlen, 1, -1)) - ERR_print_errors(bio_err); - } else if (hexdump) { - BIO_dump(out, (char *)buf_out, buf_outlen); - } else { - BIO_write(out, buf_out, buf_outlen); - } - - end: - EVP_PKEY_CTX_free(ctx); - release_engine(e); - BIO_free(in); - BIO_free_all(out); - OPENSSL_free(buf_in); - OPENSSL_free(buf_out); - OPENSSL_free(sig); - sk_OPENSSL_STRING_free(pkeyopts); - return ret; -} - -static EVP_PKEY_CTX *init_ctx(const char *kdfalg, int *pkeysize, - const char *keyfile, int keyform, int key_type, - char *passinarg, int pkey_op, ENGINE *e, - const int engine_impl) -{ - EVP_PKEY *pkey = NULL; - EVP_PKEY_CTX *ctx = NULL; - ENGINE *impl = NULL; - char *passin = NULL; - int rv = -1; - X509 *x; - if (((pkey_op == EVP_PKEY_OP_SIGN) || (pkey_op == EVP_PKEY_OP_DECRYPT) - || (pkey_op == EVP_PKEY_OP_DERIVE)) - && (key_type != KEY_PRIVKEY && kdfalg == NULL)) { - BIO_printf(bio_err, "A private key is needed for this operation\n"); - goto end; - } - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - switch (key_type) { - case KEY_PRIVKEY: - pkey = load_key(keyfile, keyform, 0, passin, e, "Private Key"); - break; - - case KEY_PUBKEY: - pkey = load_pubkey(keyfile, keyform, 0, NULL, e, "Public Key"); - break; - - case KEY_CERT: - x = load_cert(keyfile, keyform, "Certificate"); - if (x) { - pkey = X509_get_pubkey(x); - X509_free(x); - } - break; - - case KEY_NONE: - break; - - } - -#ifndef OPENSSL_NO_ENGINE - if (engine_impl) - impl = e; -#endif - - if (kdfalg != NULL) { - int kdfnid = OBJ_sn2nid(kdfalg); - - if (kdfnid == NID_undef) { - kdfnid = OBJ_ln2nid(kdfalg); - if (kdfnid == NID_undef) { - BIO_printf(bio_err, "The given KDF \"%s\" is unknown.\n", - kdfalg); - goto end; - } - } - ctx = EVP_PKEY_CTX_new_id(kdfnid, impl); - } else { - if (pkey == NULL) - goto end; - *pkeysize = EVP_PKEY_size(pkey); - ctx = EVP_PKEY_CTX_new(pkey, impl); - EVP_PKEY_free(pkey); - } - - if (ctx == NULL) - goto end; - - switch (pkey_op) { - case EVP_PKEY_OP_SIGN: - rv = EVP_PKEY_sign_init(ctx); - break; - - case EVP_PKEY_OP_VERIFY: - rv = EVP_PKEY_verify_init(ctx); - break; - - case EVP_PKEY_OP_VERIFYRECOVER: - rv = EVP_PKEY_verify_recover_init(ctx); - break; - - case EVP_PKEY_OP_ENCRYPT: - rv = EVP_PKEY_encrypt_init(ctx); - break; - - case EVP_PKEY_OP_DECRYPT: - rv = EVP_PKEY_decrypt_init(ctx); - break; - - case EVP_PKEY_OP_DERIVE: - rv = EVP_PKEY_derive_init(ctx); - break; - } - - if (rv <= 0) { - EVP_PKEY_CTX_free(ctx); - ctx = NULL; - } - - end: - OPENSSL_free(passin); - return ctx; - -} - -static int setup_peer(EVP_PKEY_CTX *ctx, int peerform, const char *file, - ENGINE *e) -{ - EVP_PKEY *peer = NULL; - ENGINE *engine = NULL; - int ret; - - if (peerform == FORMAT_ENGINE) - engine = e; - peer = load_pubkey(file, peerform, 0, NULL, engine, "Peer Key"); - if (peer == NULL) { - BIO_printf(bio_err, "Error reading peer key %s\n", file); - ERR_print_errors(bio_err); - return 0; - } - - ret = EVP_PKEY_derive_set_peer(ctx, peer); - - EVP_PKEY_free(peer); - if (ret <= 0) - ERR_print_errors(bio_err); - return ret; -} - -static int do_keyop(EVP_PKEY_CTX *ctx, int pkey_op, - unsigned char *out, size_t *poutlen, - const unsigned char *in, size_t inlen) -{ - int rv = 0; - switch (pkey_op) { - case EVP_PKEY_OP_VERIFYRECOVER: - rv = EVP_PKEY_verify_recover(ctx, out, poutlen, in, inlen); - break; - - case EVP_PKEY_OP_SIGN: - rv = EVP_PKEY_sign(ctx, out, poutlen, in, inlen); - break; - - case EVP_PKEY_OP_ENCRYPT: - rv = EVP_PKEY_encrypt(ctx, out, poutlen, in, inlen); - break; - - case EVP_PKEY_OP_DECRYPT: - rv = EVP_PKEY_decrypt(ctx, out, poutlen, in, inlen); - break; - - case EVP_PKEY_OP_DERIVE: - rv = EVP_PKEY_derive(ctx, out, poutlen); - break; - - } - return rv; -} diff --git a/contrib/libs/openssl/apps/prime.c b/contrib/libs/openssl/apps/prime.c deleted file mode 100644 index 6944797646..0000000000 --- a/contrib/libs/openssl/apps/prime.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <string.h> - -#include "apps.h" -#include "progs.h" -#include <openssl/bn.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_HEX, OPT_GENERATE, OPT_BITS, OPT_SAFE, OPT_CHECKS -} OPTION_CHOICE; - -const OPTIONS prime_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] [number...]\n"}, - {OPT_HELP_STR, 1, '-', - " number Number to check for primality\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"hex", OPT_HEX, '-', "Hex output"}, - {"generate", OPT_GENERATE, '-', "Generate a prime"}, - {"bits", OPT_BITS, 'p', "Size of number in bits"}, - {"safe", OPT_SAFE, '-', - "When used with -generate, generate a safe prime"}, - {"checks", OPT_CHECKS, 'p', "Number of checks"}, - {NULL} -}; - -int prime_main(int argc, char **argv) -{ - BIGNUM *bn = NULL; - int hex = 0, checks = 20, generate = 0, bits = 0, safe = 0, ret = 1; - char *prog; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, prime_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: -opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(prime_options); - ret = 0; - goto end; - case OPT_HEX: - hex = 1; - break; - case OPT_GENERATE: - generate = 1; - break; - case OPT_BITS: - bits = atoi(opt_arg()); - break; - case OPT_SAFE: - safe = 1; - break; - case OPT_CHECKS: - checks = atoi(opt_arg()); - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (generate) { - if (argc != 0) { - BIO_printf(bio_err, "Extra arguments given.\n"); - goto opthelp; - } - } else if (argc == 0) { - BIO_printf(bio_err, "%s: No prime specified\n", prog); - goto opthelp; - } - - if (generate) { - char *s; - - if (!bits) { - BIO_printf(bio_err, "Specify the number of bits.\n"); - goto end; - } - bn = BN_new(); - if (bn == NULL) { - BIO_printf(bio_err, "Out of memory.\n"); - goto end; - } - if (!BN_generate_prime_ex(bn, bits, safe, NULL, NULL, NULL)) { - BIO_printf(bio_err, "Failed to generate prime.\n"); - goto end; - } - s = hex ? BN_bn2hex(bn) : BN_bn2dec(bn); - if (s == NULL) { - BIO_printf(bio_err, "Out of memory.\n"); - goto end; - } - BIO_printf(bio_out, "%s\n", s); - OPENSSL_free(s); - } else { - for ( ; *argv; argv++) { - int r; - - if (hex) - r = BN_hex2bn(&bn, argv[0]); - else - r = BN_dec2bn(&bn, argv[0]); - - if (!r) { - BIO_printf(bio_err, "Failed to process value (%s)\n", argv[0]); - goto end; - } - - BN_print(bio_out, bn); - BIO_printf(bio_out, " (%s) %s prime\n", - argv[0], - BN_is_prime_ex(bn, checks, NULL, NULL) - ? "is" : "is not"); - } - } - - ret = 0; - end: - BN_free(bn); - return ret; -} diff --git a/contrib/libs/openssl/apps/progs-linux_aarch64-linux-osx_arm64.h b/contrib/libs/openssl/apps/progs-linux_aarch64-linux-osx_arm64.h deleted file mode 100644 index 005abd2dd3..0000000000 --- a/contrib/libs/openssl/apps/progs-linux_aarch64-linux-osx_arm64.h +++ /dev/null @@ -1,507 +0,0 @@ -/* - * WARNING: do not edit! - * Generated by apps/progs.pl - * - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -typedef enum FUNC_TYPE { - FT_none, FT_general, FT_md, FT_cipher, FT_pkey, - FT_md_alg, FT_cipher_alg -} FUNC_TYPE; - -typedef struct function_st { - FUNC_TYPE type; - const char *name; - int (*func)(int argc, char *argv[]); - const OPTIONS *help; -} FUNCTION; - -DEFINE_LHASH_OF(FUNCTION); - -extern int asn1parse_main(int argc, char *argv[]); -extern int ca_main(int argc, char *argv[]); -extern int ciphers_main(int argc, char *argv[]); -extern int cms_main(int argc, char *argv[]); -extern int crl_main(int argc, char *argv[]); -extern int crl2pkcs7_main(int argc, char *argv[]); -extern int dgst_main(int argc, char *argv[]); -extern int dhparam_main(int argc, char *argv[]); -extern int dsa_main(int argc, char *argv[]); -extern int dsaparam_main(int argc, char *argv[]); -extern int ec_main(int argc, char *argv[]); -extern int ecparam_main(int argc, char *argv[]); -extern int enc_main(int argc, char *argv[]); -extern int engine_main(int argc, char *argv[]); -extern int errstr_main(int argc, char *argv[]); -extern int gendsa_main(int argc, char *argv[]); -extern int genpkey_main(int argc, char *argv[]); -extern int genrsa_main(int argc, char *argv[]); -extern int help_main(int argc, char *argv[]); -extern int list_main(int argc, char *argv[]); -extern int nseq_main(int argc, char *argv[]); -extern int ocsp_main(int argc, char *argv[]); -extern int passwd_main(int argc, char *argv[]); -extern int pkcs12_main(int argc, char *argv[]); -extern int pkcs7_main(int argc, char *argv[]); -extern int pkcs8_main(int argc, char *argv[]); -extern int pkey_main(int argc, char *argv[]); -extern int pkeyparam_main(int argc, char *argv[]); -extern int pkeyutl_main(int argc, char *argv[]); -extern int prime_main(int argc, char *argv[]); -extern int rand_main(int argc, char *argv[]); -extern int rehash_main(int argc, char *argv[]); -extern int req_main(int argc, char *argv[]); -extern int rsa_main(int argc, char *argv[]); -extern int rsautl_main(int argc, char *argv[]); -extern int s_client_main(int argc, char *argv[]); -extern int s_server_main(int argc, char *argv[]); -extern int s_time_main(int argc, char *argv[]); -extern int sess_id_main(int argc, char *argv[]); -extern int smime_main(int argc, char *argv[]); -extern int speed_main(int argc, char *argv[]); -extern int spkac_main(int argc, char *argv[]); -extern int srp_main(int argc, char *argv[]); -extern int storeutl_main(int argc, char *argv[]); -extern int ts_main(int argc, char *argv[]); -extern int verify_main(int argc, char *argv[]); -extern int version_main(int argc, char *argv[]); -extern int x509_main(int argc, char *argv[]); - -extern const OPTIONS asn1parse_options[]; -extern const OPTIONS ca_options[]; -extern const OPTIONS ciphers_options[]; -extern const OPTIONS cms_options[]; -extern const OPTIONS crl_options[]; -extern const OPTIONS crl2pkcs7_options[]; -extern const OPTIONS dgst_options[]; -extern const OPTIONS dhparam_options[]; -extern const OPTIONS dsa_options[]; -extern const OPTIONS dsaparam_options[]; -extern const OPTIONS ec_options[]; -extern const OPTIONS ecparam_options[]; -extern const OPTIONS enc_options[]; -extern const OPTIONS engine_options[]; -extern const OPTIONS errstr_options[]; -extern const OPTIONS gendsa_options[]; -extern const OPTIONS genpkey_options[]; -extern const OPTIONS genrsa_options[]; -extern const OPTIONS help_options[]; -extern const OPTIONS list_options[]; -extern const OPTIONS nseq_options[]; -extern const OPTIONS ocsp_options[]; -extern const OPTIONS passwd_options[]; -extern const OPTIONS pkcs12_options[]; -extern const OPTIONS pkcs7_options[]; -extern const OPTIONS pkcs8_options[]; -extern const OPTIONS pkey_options[]; -extern const OPTIONS pkeyparam_options[]; -extern const OPTIONS pkeyutl_options[]; -extern const OPTIONS prime_options[]; -extern const OPTIONS rand_options[]; -extern const OPTIONS rehash_options[]; -extern const OPTIONS req_options[]; -extern const OPTIONS rsa_options[]; -extern const OPTIONS rsautl_options[]; -extern const OPTIONS s_client_options[]; -extern const OPTIONS s_server_options[]; -extern const OPTIONS s_time_options[]; -extern const OPTIONS sess_id_options[]; -extern const OPTIONS smime_options[]; -extern const OPTIONS speed_options[]; -extern const OPTIONS spkac_options[]; -extern const OPTIONS srp_options[]; -extern const OPTIONS storeutl_options[]; -extern const OPTIONS ts_options[]; -extern const OPTIONS verify_options[]; -extern const OPTIONS version_options[]; -extern const OPTIONS x509_options[]; - -#ifdef INCLUDE_FUNCTION_TABLE -static FUNCTION functions[] = { - {FT_general, "asn1parse", asn1parse_main, asn1parse_options}, - {FT_general, "ca", ca_main, ca_options}, -#ifndef OPENSSL_NO_SOCK - {FT_general, "ciphers", ciphers_main, ciphers_options}, -#endif -#ifndef OPENSSL_NO_CMS - {FT_general, "cms", cms_main, cms_options}, -#endif - {FT_general, "crl", crl_main, crl_options}, - {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options}, - {FT_general, "dgst", dgst_main, dgst_options}, -#ifndef OPENSSL_NO_DH - {FT_general, "dhparam", dhparam_main, dhparam_options}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsa", dsa_main, dsa_options}, -#endif -#ifndef OPENSSL_NO_DSA - {FT_general, "dsaparam", dsaparam_main, dsaparam_options}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ec", ec_main, ec_options}, -#endif -#ifndef OPENSSL_NO_EC - {FT_general, "ecparam", ecparam_main, ecparam_options}, -#endif - {FT_general, "enc", enc_main, enc_options}, -#ifndef OPENSSL_NO_ENGINE - {FT_general, "engine", engine_main, engine_options}, -#endif - {FT_general, "errstr", errstr_main, errstr_options}, -#ifndef OPENSSL_NO_DSA - {FT_general, "gendsa", gendsa_main, gendsa_options}, -#endif - {FT_general, "genpkey", genpkey_main, genpkey_options}, -#ifndef OPENSSL_NO_RSA - {FT_general, "genrsa", genrsa_main, genrsa_options}, -#endif - {FT_general, "help", help_main, help_options}, - {FT_general, "list", list_main, list_options}, - {FT_general, "nseq", nseq_main, nseq_options}, -#ifndef OPENSSL_NO_OCSP - {FT_general, "ocsp", ocsp_main, ocsp_options}, -#endif - {FT_general, "passwd", passwd_main, passwd_options}, -#ifndef OPENSSL_NO_DES - {FT_general, "pkcs12", pkcs12_main, pkcs12_options}, -#endif - {FT_general, "pkcs7", pkcs7_main, pkcs7_options}, - {FT_general, "pkcs8", pkcs8_main, pkcs8_options}, - {FT_general, "pkey", pkey_main, pkey_options}, - {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options}, - {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options}, - {FT_general, "prime", prime_main, prime_options}, - {FT_general, "rand", rand_main, rand_options}, - {FT_general, "rehash", rehash_main, rehash_options}, - {FT_general, "req", req_main, req_options}, - {FT_general, "rsa", rsa_main, rsa_options}, -#ifndef OPENSSL_NO_RSA - {FT_general, "rsautl", rsautl_main, rsautl_options}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_client", s_client_main, s_client_options}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_server", s_server_main, s_server_options}, -#endif -#ifndef OPENSSL_NO_SOCK - {FT_general, "s_time", s_time_main, s_time_options}, -#endif - {FT_general, "sess_id", sess_id_main, sess_id_options}, - {FT_general, "smime", smime_main, smime_options}, - {FT_general, "speed", speed_main, speed_options}, - {FT_general, "spkac", spkac_main, spkac_options}, -#ifndef OPENSSL_NO_SRP - {FT_general, "srp", srp_main, srp_options}, -#endif - {FT_general, "storeutl", storeutl_main, storeutl_options}, -#ifndef OPENSSL_NO_TS - {FT_general, "ts", ts_main, ts_options}, -#endif - {FT_general, "verify", verify_main, verify_options}, - {FT_general, "version", version_main, version_options}, - {FT_general, "x509", x509_main, x509_options}, -#ifndef OPENSSL_NO_MD2 - {FT_md, "md2", dgst_main}, -#endif -#ifndef OPENSSL_NO_MD4 - {FT_md, "md4", dgst_main}, -#endif - {FT_md, "md5", dgst_main}, -#ifndef OPENSSL_NO_GOST - {FT_md, "gost", dgst_main}, -#endif - {FT_md, "sha1", dgst_main}, - {FT_md, "sha224", dgst_main}, - {FT_md, "sha256", dgst_main}, - {FT_md, "sha384", dgst_main}, - {FT_md, "sha512", dgst_main}, - {FT_md, "sha512-224", dgst_main}, - {FT_md, "sha512-256", dgst_main}, - {FT_md, "sha3-224", dgst_main}, - {FT_md, "sha3-256", dgst_main}, - {FT_md, "sha3-384", dgst_main}, - {FT_md, "sha3-512", dgst_main}, - {FT_md, "shake128", dgst_main}, - {FT_md, "shake256", dgst_main}, -#ifndef OPENSSL_NO_MDC2 - {FT_md, "mdc2", dgst_main}, -#endif -#ifndef OPENSSL_NO_RMD160 - {FT_md, "rmd160", dgst_main}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2b512", dgst_main}, -#endif -#ifndef OPENSSL_NO_BLAKE2 - {FT_md, "blake2s256", dgst_main}, -#endif -#ifndef OPENSSL_NO_SM3 - {FT_md, "sm3", dgst_main}, -#endif - {FT_cipher, "aes-128-cbc", enc_main, enc_options}, - {FT_cipher, "aes-128-ecb", enc_main, enc_options}, - {FT_cipher, "aes-192-cbc", enc_main, enc_options}, - {FT_cipher, "aes-192-ecb", enc_main, enc_options}, - {FT_cipher, "aes-256-cbc", enc_main, enc_options}, - {FT_cipher, "aes-256-ecb", enc_main, enc_options}, -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ctr", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb1", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-128-cfb8", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ctr", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb1", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-192-cfb8", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ctr", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb1", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_ARIA - {FT_cipher, "aria-256-cfb8", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-128-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-192-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAMELLIA - {FT_cipher, "camellia-256-ecb", enc_main, enc_options}, -#endif - {FT_cipher, "base64", enc_main, enc_options}, -#ifdef ZLIB - {FT_cipher, "zlib", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des3", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "desx", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC4 - {FT_cipher, "rc4-40", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_DES - {FT_cipher, "des-ede3-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_IDEA - {FT_cipher, "idea-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SEED - {FT_cipher, "seed-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-64-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC2 - {FT_cipher, "rc2-40-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_BF - {FT_cipher, "bf-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast5-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_CAST - {FT_cipher, "cast-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_RC5 - {FT_cipher, "rc5-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cbc", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ecb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-cfb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ofb", enc_main, enc_options}, -#endif -#ifndef OPENSSL_NO_SM4 - {FT_cipher, "sm4-ctr", enc_main, enc_options}, -#endif - {0, NULL, NULL} -}; -#endif diff --git a/contrib/libs/openssl/apps/progs-win.h b/contrib/libs/openssl/apps/progs-win.h deleted file mode 100644 index f9c28b0969..0000000000 --- a/contrib/libs/openssl/apps/progs-win.h +++ /dev/null @@ -1,507 +0,0 @@ -/*
- * WARNING: do not edit!
- * Generated by apps/progs.pl
- *
- * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
- *
- * Licensed under the OpenSSL license (the "License"). You may not use
- * this file except in compliance with the License. You can obtain a copy
- * in the file LICENSE in the source distribution or at
- * https://www.openssl.org/source/license.html
- */
-
-typedef enum FUNC_TYPE {
- FT_none, FT_general, FT_md, FT_cipher, FT_pkey,
- FT_md_alg, FT_cipher_alg
-} FUNC_TYPE;
-
-typedef struct function_st {
- FUNC_TYPE type;
- const char *name;
- int (*func)(int argc, char *argv[]);
- const OPTIONS *help;
-} FUNCTION;
-
-DEFINE_LHASH_OF(FUNCTION);
-
-extern int asn1parse_main(int argc, char *argv[]);
-extern int ca_main(int argc, char *argv[]);
-extern int ciphers_main(int argc, char *argv[]);
-extern int cms_main(int argc, char *argv[]);
-extern int crl_main(int argc, char *argv[]);
-extern int crl2pkcs7_main(int argc, char *argv[]);
-extern int dgst_main(int argc, char *argv[]);
-extern int dhparam_main(int argc, char *argv[]);
-extern int dsa_main(int argc, char *argv[]);
-extern int dsaparam_main(int argc, char *argv[]);
-extern int ec_main(int argc, char *argv[]);
-extern int ecparam_main(int argc, char *argv[]);
-extern int enc_main(int argc, char *argv[]);
-extern int engine_main(int argc, char *argv[]);
-extern int errstr_main(int argc, char *argv[]);
-extern int gendsa_main(int argc, char *argv[]);
-extern int genpkey_main(int argc, char *argv[]);
-extern int genrsa_main(int argc, char *argv[]);
-extern int help_main(int argc, char *argv[]);
-extern int list_main(int argc, char *argv[]);
-extern int nseq_main(int argc, char *argv[]);
-extern int ocsp_main(int argc, char *argv[]);
-extern int passwd_main(int argc, char *argv[]);
-extern int pkcs12_main(int argc, char *argv[]);
-extern int pkcs7_main(int argc, char *argv[]);
-extern int pkcs8_main(int argc, char *argv[]);
-extern int pkey_main(int argc, char *argv[]);
-extern int pkeyparam_main(int argc, char *argv[]);
-extern int pkeyutl_main(int argc, char *argv[]);
-extern int prime_main(int argc, char *argv[]);
-extern int rand_main(int argc, char *argv[]);
-extern int rehash_main(int argc, char *argv[]);
-extern int req_main(int argc, char *argv[]);
-extern int rsa_main(int argc, char *argv[]);
-extern int rsautl_main(int argc, char *argv[]);
-extern int s_client_main(int argc, char *argv[]);
-extern int s_server_main(int argc, char *argv[]);
-extern int s_time_main(int argc, char *argv[]);
-extern int sess_id_main(int argc, char *argv[]);
-extern int smime_main(int argc, char *argv[]);
-extern int speed_main(int argc, char *argv[]);
-extern int spkac_main(int argc, char *argv[]);
-extern int srp_main(int argc, char *argv[]);
-extern int storeutl_main(int argc, char *argv[]);
-extern int ts_main(int argc, char *argv[]);
-extern int verify_main(int argc, char *argv[]);
-extern int version_main(int argc, char *argv[]);
-extern int x509_main(int argc, char *argv[]);
-
-extern const OPTIONS asn1parse_options[];
-extern const OPTIONS ca_options[];
-extern const OPTIONS ciphers_options[];
-extern const OPTIONS cms_options[];
-extern const OPTIONS crl_options[];
-extern const OPTIONS crl2pkcs7_options[];
-extern const OPTIONS dgst_options[];
-extern const OPTIONS dhparam_options[];
-extern const OPTIONS dsa_options[];
-extern const OPTIONS dsaparam_options[];
-extern const OPTIONS ec_options[];
-extern const OPTIONS ecparam_options[];
-extern const OPTIONS enc_options[];
-extern const OPTIONS engine_options[];
-extern const OPTIONS errstr_options[];
-extern const OPTIONS gendsa_options[];
-extern const OPTIONS genpkey_options[];
-extern const OPTIONS genrsa_options[];
-extern const OPTIONS help_options[];
-extern const OPTIONS list_options[];
-extern const OPTIONS nseq_options[];
-extern const OPTIONS ocsp_options[];
-extern const OPTIONS passwd_options[];
-extern const OPTIONS pkcs12_options[];
-extern const OPTIONS pkcs7_options[];
-extern const OPTIONS pkcs8_options[];
-extern const OPTIONS pkey_options[];
-extern const OPTIONS pkeyparam_options[];
-extern const OPTIONS pkeyutl_options[];
-extern const OPTIONS prime_options[];
-extern const OPTIONS rand_options[];
-extern const OPTIONS rehash_options[];
-extern const OPTIONS req_options[];
-extern const OPTIONS rsa_options[];
-extern const OPTIONS rsautl_options[];
-extern const OPTIONS s_client_options[];
-extern const OPTIONS s_server_options[];
-extern const OPTIONS s_time_options[];
-extern const OPTIONS sess_id_options[];
-extern const OPTIONS smime_options[];
-extern const OPTIONS speed_options[];
-extern const OPTIONS spkac_options[];
-extern const OPTIONS srp_options[];
-extern const OPTIONS storeutl_options[];
-extern const OPTIONS ts_options[];
-extern const OPTIONS verify_options[];
-extern const OPTIONS version_options[];
-extern const OPTIONS x509_options[];
-
-#ifdef INCLUDE_FUNCTION_TABLE
-static FUNCTION functions[] = {
- {FT_general, "asn1parse", asn1parse_main, asn1parse_options},
- {FT_general, "ca", ca_main, ca_options},
-#ifndef OPENSSL_NO_SOCK
- {FT_general, "ciphers", ciphers_main, ciphers_options},
-#endif
-#ifndef OPENSSL_NO_CMS
- {FT_general, "cms", cms_main, cms_options},
-#endif
- {FT_general, "crl", crl_main, crl_options},
- {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options},
- {FT_general, "dgst", dgst_main, dgst_options},
-#ifndef OPENSSL_NO_DH
- {FT_general, "dhparam", dhparam_main, dhparam_options},
-#endif
-#ifndef OPENSSL_NO_DSA
- {FT_general, "dsa", dsa_main, dsa_options},
-#endif
-#ifndef OPENSSL_NO_DSA
- {FT_general, "dsaparam", dsaparam_main, dsaparam_options},
-#endif
-#ifndef OPENSSL_NO_EC
- {FT_general, "ec", ec_main, ec_options},
-#endif
-#ifndef OPENSSL_NO_EC
- {FT_general, "ecparam", ecparam_main, ecparam_options},
-#endif
- {FT_general, "enc", enc_main, enc_options},
-#ifndef OPENSSL_NO_ENGINE
- {FT_general, "engine", engine_main, engine_options},
-#endif
- {FT_general, "errstr", errstr_main, errstr_options},
-#ifndef OPENSSL_NO_DSA
- {FT_general, "gendsa", gendsa_main, gendsa_options},
-#endif
- {FT_general, "genpkey", genpkey_main, genpkey_options},
-#ifndef OPENSSL_NO_RSA
- {FT_general, "genrsa", genrsa_main, genrsa_options},
-#endif
- {FT_general, "help", help_main, help_options},
- {FT_general, "list", list_main, list_options},
- {FT_general, "nseq", nseq_main, nseq_options},
-#ifndef OPENSSL_NO_OCSP
- {FT_general, "ocsp", ocsp_main, ocsp_options},
-#endif
- {FT_general, "passwd", passwd_main, passwd_options},
-#ifndef OPENSSL_NO_DES
- {FT_general, "pkcs12", pkcs12_main, pkcs12_options},
-#endif
- {FT_general, "pkcs7", pkcs7_main, pkcs7_options},
- {FT_general, "pkcs8", pkcs8_main, pkcs8_options},
- {FT_general, "pkey", pkey_main, pkey_options},
- {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options},
- {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options},
- {FT_general, "prime", prime_main, prime_options},
- {FT_general, "rand", rand_main, rand_options},
- {FT_general, "rehash", rehash_main, rehash_options},
- {FT_general, "req", req_main, req_options},
- {FT_general, "rsa", rsa_main, rsa_options},
-#ifndef OPENSSL_NO_RSA
- {FT_general, "rsautl", rsautl_main, rsautl_options},
-#endif
-#ifndef OPENSSL_NO_SOCK
- {FT_general, "s_client", s_client_main, s_client_options},
-#endif
-#ifndef OPENSSL_NO_SOCK
- {FT_general, "s_server", s_server_main, s_server_options},
-#endif
-#ifndef OPENSSL_NO_SOCK
- {FT_general, "s_time", s_time_main, s_time_options},
-#endif
- {FT_general, "sess_id", sess_id_main, sess_id_options},
- {FT_general, "smime", smime_main, smime_options},
- {FT_general, "speed", speed_main, speed_options},
- {FT_general, "spkac", spkac_main, spkac_options},
-#ifndef OPENSSL_NO_SRP
- {FT_general, "srp", srp_main, srp_options},
-#endif
- {FT_general, "storeutl", storeutl_main, storeutl_options},
-#ifndef OPENSSL_NO_TS
- {FT_general, "ts", ts_main, ts_options},
-#endif
- {FT_general, "verify", verify_main, verify_options},
- {FT_general, "version", version_main, version_options},
- {FT_general, "x509", x509_main, x509_options},
-#ifndef OPENSSL_NO_MD2
- {FT_md, "md2", dgst_main},
-#endif
-#ifndef OPENSSL_NO_MD4
- {FT_md, "md4", dgst_main},
-#endif
- {FT_md, "md5", dgst_main},
-#ifndef OPENSSL_NO_GOST
- {FT_md, "gost", dgst_main},
-#endif
- {FT_md, "sha1", dgst_main},
- {FT_md, "sha224", dgst_main},
- {FT_md, "sha256", dgst_main},
- {FT_md, "sha384", dgst_main},
- {FT_md, "sha512", dgst_main},
- {FT_md, "sha512-224", dgst_main},
- {FT_md, "sha512-256", dgst_main},
- {FT_md, "sha3-224", dgst_main},
- {FT_md, "sha3-256", dgst_main},
- {FT_md, "sha3-384", dgst_main},
- {FT_md, "sha3-512", dgst_main},
- {FT_md, "shake128", dgst_main},
- {FT_md, "shake256", dgst_main},
-#ifndef OPENSSL_NO_MDC2
- {FT_md, "mdc2", dgst_main},
-#endif
-#ifndef OPENSSL_NO_RMD160
- {FT_md, "rmd160", dgst_main},
-#endif
-#ifndef OPENSSL_NO_BLAKE2
- {FT_md, "blake2b512", dgst_main},
-#endif
-#ifndef OPENSSL_NO_BLAKE2
- {FT_md, "blake2s256", dgst_main},
-#endif
-#ifndef OPENSSL_NO_SM3
- {FT_md, "sm3", dgst_main},
-#endif
- {FT_cipher, "aes-128-cbc", enc_main, enc_options},
- {FT_cipher, "aes-128-ecb", enc_main, enc_options},
- {FT_cipher, "aes-192-cbc", enc_main, enc_options},
- {FT_cipher, "aes-192-ecb", enc_main, enc_options},
- {FT_cipher, "aes-256-cbc", enc_main, enc_options},
- {FT_cipher, "aes-256-ecb", enc_main, enc_options},
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-ctr", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-cfb1", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-128-cfb8", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-ctr", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-cfb1", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-192-cfb8", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-ctr", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-cfb1", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_ARIA
- {FT_cipher, "aria-256-cfb8", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAMELLIA
- {FT_cipher, "camellia-128-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAMELLIA
- {FT_cipher, "camellia-128-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAMELLIA
- {FT_cipher, "camellia-192-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAMELLIA
- {FT_cipher, "camellia-192-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAMELLIA
- {FT_cipher, "camellia-256-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAMELLIA
- {FT_cipher, "camellia-256-ecb", enc_main, enc_options},
-#endif
- {FT_cipher, "base64", enc_main, enc_options},
-#ifdef ZLIB
- {FT_cipher, "zlib", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des3", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "desx", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_IDEA
- {FT_cipher, "idea", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SEED
- {FT_cipher, "seed", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC4
- {FT_cipher, "rc4", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC4
- {FT_cipher, "rc4-40", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_BF
- {FT_cipher, "bf", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAST
- {FT_cipher, "cast", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC5
- {FT_cipher, "rc5", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede3", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede3-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede3-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_DES
- {FT_cipher, "des-ede3-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_IDEA
- {FT_cipher, "idea-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_IDEA
- {FT_cipher, "idea-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_IDEA
- {FT_cipher, "idea-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_IDEA
- {FT_cipher, "idea-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SEED
- {FT_cipher, "seed-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SEED
- {FT_cipher, "seed-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SEED
- {FT_cipher, "seed-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SEED
- {FT_cipher, "seed-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2-64-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC2
- {FT_cipher, "rc2-40-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_BF
- {FT_cipher, "bf-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_BF
- {FT_cipher, "bf-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_BF
- {FT_cipher, "bf-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_BF
- {FT_cipher, "bf-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAST
- {FT_cipher, "cast5-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAST
- {FT_cipher, "cast5-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAST
- {FT_cipher, "cast5-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAST
- {FT_cipher, "cast5-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_CAST
- {FT_cipher, "cast-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC5
- {FT_cipher, "rc5-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC5
- {FT_cipher, "rc5-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC5
- {FT_cipher, "rc5-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_RC5
- {FT_cipher, "rc5-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SM4
- {FT_cipher, "sm4-cbc", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SM4
- {FT_cipher, "sm4-ecb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SM4
- {FT_cipher, "sm4-cfb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SM4
- {FT_cipher, "sm4-ofb", enc_main, enc_options},
-#endif
-#ifndef OPENSSL_NO_SM4
- {FT_cipher, "sm4-ctr", enc_main, enc_options},
-#endif
- {0, NULL, NULL}
-};
-#endif
diff --git a/contrib/libs/openssl/apps/progs.h b/contrib/libs/openssl/apps/progs.h deleted file mode 100644 index a8b3e70a41..0000000000 --- a/contrib/libs/openssl/apps/progs.h +++ /dev/null @@ -1,5 +0,0 @@ -#if defined(_MSC_VER) && defined(_M_X64) -# include "progs-win.h" -#else -# include "progs-linux_aarch64-linux-osx_arm64.h" -#endif diff --git a/contrib/libs/openssl/apps/rand.c b/contrib/libs/openssl/apps/rand.c deleted file mode 100644 index 4c6181507b..0000000000 --- a/contrib/libs/openssl/apps/rand.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "apps.h" -#include "progs.h" - -#include <ctype.h> -#include <stdio.h> -#include <string.h> - -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/rand.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_OUT, OPT_ENGINE, OPT_BASE64, OPT_HEX, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS rand_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [flags] num\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"out", OPT_OUT, '>', "Output file"}, - OPT_R_OPTIONS, - {"base64", OPT_BASE64, '-', "Base64 encode output"}, - {"hex", OPT_HEX, '-', "Hex encode output"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int rand_main(int argc, char **argv) -{ - ENGINE *e = NULL; - BIO *out = NULL; - char *outfile = NULL, *prog; - OPTION_CHOICE o; - int format = FORMAT_BINARY, i, num = -1, r, ret = 1; - - prog = opt_init(argc, argv, rand_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(rand_options); - ret = 0; - goto end; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_BASE64: - format = FORMAT_BASE64; - break; - case OPT_HEX: - format = FORMAT_TEXT; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - if (argc == 1) { - if (!opt_int(argv[0], &num) || num <= 0) - goto end; - } else if (argc > 0) { - BIO_printf(bio_err, "Extra arguments given.\n"); - goto opthelp; - } - - out = bio_open_default(outfile, 'w', format); - if (out == NULL) - goto end; - - if (format == FORMAT_BASE64) { - BIO *b64 = BIO_new(BIO_f_base64()); - if (b64 == NULL) - goto end; - out = BIO_push(b64, out); - } - - while (num > 0) { - unsigned char buf[4096]; - int chunk; - - chunk = num; - if (chunk > (int)sizeof(buf)) - chunk = sizeof(buf); - r = RAND_bytes(buf, chunk); - if (r <= 0) - goto end; - if (format != FORMAT_TEXT) { - if (BIO_write(out, buf, chunk) != chunk) - goto end; - } else { - for (i = 0; i < chunk; i++) - if (BIO_printf(out, "%02x", buf[i]) != 2) - goto end; - } - num -= chunk; - } - if (format == FORMAT_TEXT) - BIO_puts(out, "\n"); - if (BIO_flush(out) <= 0) - goto end; - - ret = 0; - - end: - if (ret != 0) - ERR_print_errors(bio_err); - release_engine(e); - BIO_free_all(out); - return ret; -} diff --git a/contrib/libs/openssl/apps/rehash.c b/contrib/libs/openssl/apps/rehash.c deleted file mode 100644 index fc1dffe974..0000000000 --- a/contrib/libs/openssl/apps/rehash.c +++ /dev/null @@ -1,540 +0,0 @@ -/* - * Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved. - * Copyright (c) 2013-2014 Timo Teräs <timo.teras@gmail.com> - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "apps.h" -#include "progs.h" - -#if defined(OPENSSL_SYS_UNIX) || defined(__APPLE__) || \ - (defined(__VMS) && defined(__DECC) && __CRTL_VER >= 80300000) -# include <unistd.h> -# include <stdio.h> -# include <limits.h> -# include <errno.h> -# include <string.h> -# include <ctype.h> -# include <sys/stat.h> - -/* - * Make sure that the processing of symbol names is treated the same as when - * libcrypto is built. This is done automatically for public headers (see - * include/openssl/__DECC_INCLUDE_PROLOGUE.H and __DECC_INCLUDE_EPILOGUE.H), - * but not for internal headers. - */ -# ifdef __VMS -# pragma names save -# pragma names as_is,shortened -# endif - -# include "internal/o_dir.h" - -# ifdef __VMS -# pragma names restore -# endif - -# include <openssl/evp.h> -# include <openssl/pem.h> -# include <openssl/x509.h> - - -# ifndef PATH_MAX -# define PATH_MAX 4096 -# endif -# ifndef NAME_MAX -# define NAME_MAX 255 -# endif -# define MAX_COLLISIONS 256 - -# if defined(OPENSSL_SYS_VXWORKS) -/* - * VxWorks has no symbolic links - */ - -# define lstat(path, buf) stat(path, buf) - -int symlink(const char *target, const char *linkpath) -{ - errno = ENOSYS; - return -1; -} - -ssize_t readlink(const char *pathname, char *buf, size_t bufsiz) -{ - errno = ENOSYS; - return -1; -} -# endif - -typedef struct hentry_st { - struct hentry_st *next; - char *filename; - unsigned short old_id; - unsigned char need_symlink; - unsigned char digest[EVP_MAX_MD_SIZE]; -} HENTRY; - -typedef struct bucket_st { - struct bucket_st *next; - HENTRY *first_entry, *last_entry; - unsigned int hash; - unsigned short type; - unsigned short num_needed; -} BUCKET; - -enum Type { - /* Keep in sync with |suffixes|, below. */ - TYPE_CERT=0, TYPE_CRL=1 -}; - -enum Hash { - HASH_OLD, HASH_NEW, HASH_BOTH -}; - - -static int evpmdsize; -static const EVP_MD *evpmd; -static int remove_links = 1; -static int verbose = 0; -static BUCKET *hash_table[257]; - -static const char *suffixes[] = { "", "r" }; -static const char *extensions[] = { "pem", "crt", "cer", "crl" }; - - -static void bit_set(unsigned char *set, unsigned int bit) -{ - set[bit >> 3] |= 1 << (bit & 0x7); -} - -static int bit_isset(unsigned char *set, unsigned int bit) -{ - return set[bit >> 3] & (1 << (bit & 0x7)); -} - - -/* - * Process an entry; return number of errors. - */ -static int add_entry(enum Type type, unsigned int hash, const char *filename, - const unsigned char *digest, int need_symlink, - unsigned short old_id) -{ - static BUCKET nilbucket; - static HENTRY nilhentry; - BUCKET *bp; - HENTRY *ep, *found = NULL; - unsigned int ndx = (type + hash) % OSSL_NELEM(hash_table); - - for (bp = hash_table[ndx]; bp; bp = bp->next) - if (bp->type == type && bp->hash == hash) - break; - if (bp == NULL) { - bp = app_malloc(sizeof(*bp), "hash bucket"); - *bp = nilbucket; - bp->next = hash_table[ndx]; - bp->type = type; - bp->hash = hash; - hash_table[ndx] = bp; - } - - for (ep = bp->first_entry; ep; ep = ep->next) { - if (digest && memcmp(digest, ep->digest, evpmdsize) == 0) { - BIO_printf(bio_err, - "%s: warning: skipping duplicate %s in %s\n", - opt_getprog(), - type == TYPE_CERT ? "certificate" : "CRL", filename); - return 0; - } - if (strcmp(filename, ep->filename) == 0) { - found = ep; - if (digest == NULL) - break; - } - } - ep = found; - if (ep == NULL) { - if (bp->num_needed >= MAX_COLLISIONS) { - BIO_printf(bio_err, - "%s: error: hash table overflow for %s\n", - opt_getprog(), filename); - return 1; - } - ep = app_malloc(sizeof(*ep), "collision bucket"); - *ep = nilhentry; - ep->old_id = ~0; - ep->filename = OPENSSL_strdup(filename); - if (bp->last_entry) - bp->last_entry->next = ep; - if (bp->first_entry == NULL) - bp->first_entry = ep; - bp->last_entry = ep; - } - - if (old_id < ep->old_id) - ep->old_id = old_id; - if (need_symlink && !ep->need_symlink) { - ep->need_symlink = 1; - bp->num_needed++; - memcpy(ep->digest, digest, evpmdsize); - } - return 0; -} - -/* - * Check if a symlink goes to the right spot; return 0 if okay. - * This can be -1 if bad filename, or an error count. - */ -static int handle_symlink(const char *filename, const char *fullpath) -{ - unsigned int hash = 0; - int i, type, id; - unsigned char ch; - char linktarget[PATH_MAX], *endptr; - ossl_ssize_t n; - - for (i = 0; i < 8; i++) { - ch = filename[i]; - if (!isxdigit(ch)) - return -1; - hash <<= 4; - hash += OPENSSL_hexchar2int(ch); - } - if (filename[i++] != '.') - return -1; - for (type = OSSL_NELEM(suffixes) - 1; type > 0; type--) { - const char *suffix = suffixes[type]; - if (strncasecmp(suffix, &filename[i], strlen(suffix)) == 0) - break; - } - i += strlen(suffixes[type]); - - id = strtoul(&filename[i], &endptr, 10); - if (*endptr != '\0') - return -1; - - n = readlink(fullpath, linktarget, sizeof(linktarget)); - if (n < 0 || n >= (int)sizeof(linktarget)) - return -1; - linktarget[n] = 0; - - return add_entry(type, hash, linktarget, NULL, 0, id); -} - -/* - * process a file, return number of errors. - */ -static int do_file(const char *filename, const char *fullpath, enum Hash h) -{ - STACK_OF (X509_INFO) *inf = NULL; - X509_INFO *x; - X509_NAME *name = NULL; - BIO *b; - const char *ext; - unsigned char digest[EVP_MAX_MD_SIZE]; - int type, errs = 0; - size_t i; - - /* Does it end with a recognized extension? */ - if ((ext = strrchr(filename, '.')) == NULL) - goto end; - for (i = 0; i < OSSL_NELEM(extensions); i++) { - if (strcasecmp(extensions[i], ext + 1) == 0) - break; - } - if (i >= OSSL_NELEM(extensions)) - goto end; - - /* Does it have X.509 data in it? */ - if ((b = BIO_new_file(fullpath, "r")) == NULL) { - BIO_printf(bio_err, "%s: error: skipping %s, cannot open file\n", - opt_getprog(), filename); - errs++; - goto end; - } - inf = PEM_X509_INFO_read_bio(b, NULL, NULL, NULL); - BIO_free(b); - if (inf == NULL) - goto end; - - if (sk_X509_INFO_num(inf) != 1) { - BIO_printf(bio_err, - "%s: warning: skipping %s," - "it does not contain exactly one certificate or CRL\n", - opt_getprog(), filename); - /* This is not an error. */ - goto end; - } - x = sk_X509_INFO_value(inf, 0); - if (x->x509 != NULL) { - type = TYPE_CERT; - name = X509_get_subject_name(x->x509); - if (!X509_digest(x->x509, evpmd, digest, NULL)) { - BIO_printf(bio_err, "out of memory\n"); - ++errs; - goto end; - } - } else if (x->crl != NULL) { - type = TYPE_CRL; - name = X509_CRL_get_issuer(x->crl); - if (!X509_CRL_digest(x->crl, evpmd, digest, NULL)) { - BIO_printf(bio_err, "out of memory\n"); - ++errs; - goto end; - } - } else { - ++errs; - goto end; - } - if (name != NULL) { - if ((h == HASH_NEW) || (h == HASH_BOTH)) - errs += add_entry(type, X509_NAME_hash(name), filename, digest, 1, ~0); - if ((h == HASH_OLD) || (h == HASH_BOTH)) - errs += add_entry(type, X509_NAME_hash_old(name), filename, digest, 1, ~0); - } - -end: - sk_X509_INFO_pop_free(inf, X509_INFO_free); - return errs; -} - -static void str_free(char *s) -{ - OPENSSL_free(s); -} - -static int ends_with_dirsep(const char *path) -{ - if (*path != '\0') - path += strlen(path) - 1; -# if defined __VMS - if (*path == ']' || *path == '>' || *path == ':') - return 1; -# elif defined _WIN32 - if (*path == '\\') - return 1; -# endif - return *path == '/'; -} - -/* - * Process a directory; return number of errors found. - */ -static int do_dir(const char *dirname, enum Hash h) -{ - BUCKET *bp, *nextbp; - HENTRY *ep, *nextep; - OPENSSL_DIR_CTX *d = NULL; - struct stat st; - unsigned char idmask[MAX_COLLISIONS / 8]; - int n, numfiles, nextid, buflen, errs = 0; - size_t i; - const char *pathsep; - const char *filename; - char *buf, *copy = NULL; - STACK_OF(OPENSSL_STRING) *files = NULL; - - if (app_access(dirname, W_OK) < 0) { - BIO_printf(bio_err, "Skipping %s, can't write\n", dirname); - return 1; - } - buflen = strlen(dirname); - pathsep = (buflen && !ends_with_dirsep(dirname)) ? "/": ""; - buflen += NAME_MAX + 1 + 1; - buf = app_malloc(buflen, "filename buffer"); - - if (verbose) - BIO_printf(bio_out, "Doing %s\n", dirname); - - if ((files = sk_OPENSSL_STRING_new_null()) == NULL) { - BIO_printf(bio_err, "Skipping %s, out of memory\n", dirname); - errs = 1; - goto err; - } - while ((filename = OPENSSL_DIR_read(&d, dirname)) != NULL) { - if ((copy = OPENSSL_strdup(filename)) == NULL - || sk_OPENSSL_STRING_push(files, copy) == 0) { - OPENSSL_free(copy); - BIO_puts(bio_err, "out of memory\n"); - errs = 1; - goto err; - } - } - OPENSSL_DIR_end(&d); - sk_OPENSSL_STRING_sort(files); - - numfiles = sk_OPENSSL_STRING_num(files); - for (n = 0; n < numfiles; ++n) { - filename = sk_OPENSSL_STRING_value(files, n); - if (BIO_snprintf(buf, buflen, "%s%s%s", - dirname, pathsep, filename) >= buflen) - continue; - if (lstat(buf, &st) < 0) - continue; - if (S_ISLNK(st.st_mode) && handle_symlink(filename, buf) == 0) - continue; - errs += do_file(filename, buf, h); - } - - for (i = 0; i < OSSL_NELEM(hash_table); i++) { - for (bp = hash_table[i]; bp; bp = nextbp) { - nextbp = bp->next; - nextid = 0; - memset(idmask, 0, (bp->num_needed + 7) / 8); - for (ep = bp->first_entry; ep; ep = ep->next) - if (ep->old_id < bp->num_needed) - bit_set(idmask, ep->old_id); - - for (ep = bp->first_entry; ep; ep = nextep) { - nextep = ep->next; - if (ep->old_id < bp->num_needed) { - /* Link exists, and is used as-is */ - BIO_snprintf(buf, buflen, "%08x.%s%d", bp->hash, - suffixes[bp->type], ep->old_id); - if (verbose) - BIO_printf(bio_out, "link %s -> %s\n", - ep->filename, buf); - } else if (ep->need_symlink) { - /* New link needed (it may replace something) */ - while (bit_isset(idmask, nextid)) - nextid++; - - BIO_snprintf(buf, buflen, "%s%s%n%08x.%s%d", - dirname, pathsep, &n, bp->hash, - suffixes[bp->type], nextid); - if (verbose) - BIO_printf(bio_out, "link %s -> %s\n", - ep->filename, &buf[n]); - if (unlink(buf) < 0 && errno != ENOENT) { - BIO_printf(bio_err, - "%s: Can't unlink %s, %s\n", - opt_getprog(), buf, strerror(errno)); - errs++; - } - if (symlink(ep->filename, buf) < 0) { - BIO_printf(bio_err, - "%s: Can't symlink %s, %s\n", - opt_getprog(), ep->filename, - strerror(errno)); - errs++; - } - bit_set(idmask, nextid); - } else if (remove_links) { - /* Link to be deleted */ - BIO_snprintf(buf, buflen, "%s%s%n%08x.%s%d", - dirname, pathsep, &n, bp->hash, - suffixes[bp->type], ep->old_id); - if (verbose) - BIO_printf(bio_out, "unlink %s\n", - &buf[n]); - if (unlink(buf) < 0 && errno != ENOENT) { - BIO_printf(bio_err, - "%s: Can't unlink %s, %s\n", - opt_getprog(), buf, strerror(errno)); - errs++; - } - } - OPENSSL_free(ep->filename); - OPENSSL_free(ep); - } - OPENSSL_free(bp); - } - hash_table[i] = NULL; - } - - err: - sk_OPENSSL_STRING_pop_free(files, str_free); - OPENSSL_free(buf); - return errs; -} - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_COMPAT, OPT_OLD, OPT_N, OPT_VERBOSE -} OPTION_CHOICE; - -const OPTIONS rehash_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] [cert-directory...]\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"h", OPT_HELP, '-', "Display this summary"}, - {"compat", OPT_COMPAT, '-', "Create both new- and old-style hash links"}, - {"old", OPT_OLD, '-', "Use old-style hash to generate links"}, - {"n", OPT_N, '-', "Do not remove existing links"}, - {"v", OPT_VERBOSE, '-', "Verbose output"}, - {NULL} -}; - - -int rehash_main(int argc, char **argv) -{ - const char *env, *prog; - char *e, *m; - int errs = 0; - OPTION_CHOICE o; - enum Hash h = HASH_NEW; - - prog = opt_init(argc, argv, rehash_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(rehash_options); - goto end; - case OPT_COMPAT: - h = HASH_BOTH; - break; - case OPT_OLD: - h = HASH_OLD; - break; - case OPT_N: - remove_links = 0; - break; - case OPT_VERBOSE: - verbose = 1; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - evpmd = EVP_sha1(); - evpmdsize = EVP_MD_size(evpmd); - - if (*argv != NULL) { - while (*argv != NULL) - errs += do_dir(*argv++, h); - } else if ((env = getenv(X509_get_default_cert_dir_env())) != NULL) { - char lsc[2] = { LIST_SEPARATOR_CHAR, '\0' }; - m = OPENSSL_strdup(env); - for (e = strtok(m, lsc); e != NULL; e = strtok(NULL, lsc)) - errs += do_dir(e, h); - OPENSSL_free(m); - } else { - errs += do_dir(X509_get_default_cert_dir(), h); - } - - end: - return errs; -} - -#else -const OPTIONS rehash_options[] = { - {NULL} -}; - -int rehash_main(int argc, char **argv) -{ - BIO_printf(bio_err, "Not available; use c_rehash script\n"); - return 1; -} - -#endif /* defined(OPENSSL_SYS_UNIX) || defined(__APPLE__) */ diff --git a/contrib/libs/openssl/apps/req.c b/contrib/libs/openssl/apps/req.c deleted file mode 100644 index a603907cd5..0000000000 --- a/contrib/libs/openssl/apps/req.c +++ /dev/null @@ -1,1679 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#include <ctype.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/evp.h> -#include <openssl/conf.h> -#include <openssl/err.h> -#include <openssl/asn1.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/objects.h> -#include <openssl/pem.h> -#include <openssl/bn.h> -#include <openssl/lhash.h> -#ifndef OPENSSL_NO_RSA -# include <openssl/rsa.h> -#endif -#ifndef OPENSSL_NO_DSA -# include <openssl/dsa.h> -#endif - -#define SECTION "req" - -#define BITS "default_bits" -#define KEYFILE "default_keyfile" -#define PROMPT "prompt" -#define DISTINGUISHED_NAME "distinguished_name" -#define ATTRIBUTES "attributes" -#define V3_EXTENSIONS "x509_extensions" -#define REQ_EXTENSIONS "req_extensions" -#define STRING_MASK "string_mask" -#define UTF8_IN "utf8" - -#define DEFAULT_KEY_LENGTH 2048 -#define MIN_KEY_LENGTH 512 - -static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, char *dn, int mutlirdn, - int attribs, unsigned long chtype); -static int build_subject(X509_REQ *req, const char *subj, unsigned long chtype, - int multirdn); -static int prompt_info(X509_REQ *req, - STACK_OF(CONF_VALUE) *dn_sk, const char *dn_sect, - STACK_OF(CONF_VALUE) *attr_sk, const char *attr_sect, - int attribs, unsigned long chtype); -static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *sk, - STACK_OF(CONF_VALUE) *attr, int attribs, - unsigned long chtype); -static int add_attribute_object(X509_REQ *req, char *text, const char *def, - char *value, int nid, int n_min, int n_max, - unsigned long chtype); -static int add_DN_object(X509_NAME *n, char *text, const char *def, - char *value, int nid, int n_min, int n_max, - unsigned long chtype, int mval); -static int genpkey_cb(EVP_PKEY_CTX *ctx); -static int build_data(char *text, const char *def, - char *value, int n_min, int n_max, - char *buf, const int buf_size, - const char *desc1, const char *desc2 - ); -static int req_check_len(int len, int n_min, int n_max); -static int check_end(const char *str, const char *end); -static int join(char buf[], size_t buf_size, const char *name, - const char *tail, const char *desc); -static EVP_PKEY_CTX *set_keygen_ctx(const char *gstr, - int *pkey_type, long *pkeylen, - char **palgnam, ENGINE *keygen_engine); -static CONF *req_conf = NULL; -static CONF *addext_conf = NULL; -static int batch = 0; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_ENGINE, OPT_KEYGEN_ENGINE, OPT_KEY, - OPT_PUBKEY, OPT_NEW, OPT_CONFIG, OPT_KEYFORM, OPT_IN, OPT_OUT, - OPT_KEYOUT, OPT_PASSIN, OPT_PASSOUT, OPT_NEWKEY, - OPT_PKEYOPT, OPT_SIGOPT, OPT_BATCH, OPT_NEWHDR, OPT_MODULUS, - OPT_VERIFY, OPT_NODES, OPT_NOOUT, OPT_VERBOSE, OPT_UTF8, - OPT_NAMEOPT, OPT_REQOPT, OPT_SUBJ, OPT_SUBJECT, OPT_TEXT, OPT_X509, - OPT_MULTIVALUE_RDN, OPT_DAYS, OPT_SET_SERIAL, OPT_ADDEXT, OPT_EXTENSIONS, - OPT_REQEXTS, OPT_PRECERT, OPT_MD, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS req_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format - DER or PEM"}, - {"outform", OPT_OUTFORM, 'F', "Output format - DER or PEM"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"key", OPT_KEY, 's', "Private key to use"}, - {"keyform", OPT_KEYFORM, 'f', "Key file format"}, - {"pubkey", OPT_PUBKEY, '-', "Output public key"}, - {"new", OPT_NEW, '-', "New request"}, - {"config", OPT_CONFIG, '<', "Request template file"}, - {"keyout", OPT_KEYOUT, '>', "File to send the key to"}, - {"passin", OPT_PASSIN, 's', "Private key password source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - OPT_R_OPTIONS, - {"newkey", OPT_NEWKEY, 's', "Specify as type:bits"}, - {"pkeyopt", OPT_PKEYOPT, 's', "Public key options as opt:value"}, - {"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"}, - {"batch", OPT_BATCH, '-', - "Do not ask anything during request generation"}, - {"newhdr", OPT_NEWHDR, '-', "Output \"NEW\" in the header lines"}, - {"modulus", OPT_MODULUS, '-', "RSA modulus"}, - {"verify", OPT_VERIFY, '-', "Verify signature on REQ"}, - {"nodes", OPT_NODES, '-', "Don't encrypt the output key"}, - {"noout", OPT_NOOUT, '-', "Do not output REQ"}, - {"verbose", OPT_VERBOSE, '-', "Verbose output"}, - {"utf8", OPT_UTF8, '-', "Input characters are UTF8 (default ASCII)"}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - {"reqopt", OPT_REQOPT, 's', "Various request text options"}, - {"text", OPT_TEXT, '-', "Text form of request"}, - {"x509", OPT_X509, '-', - "Output a x509 structure instead of a cert request"}, - {OPT_MORE_STR, 1, 1, "(Required by some CA's)"}, - {"subj", OPT_SUBJ, 's', "Set or modify request subject"}, - {"subject", OPT_SUBJECT, '-', "Output the request's subject"}, - {"multivalue-rdn", OPT_MULTIVALUE_RDN, '-', - "Enable support for multivalued RDNs"}, - {"days", OPT_DAYS, 'p', "Number of days cert is valid for"}, - {"set_serial", OPT_SET_SERIAL, 's', "Serial number to use"}, - {"addext", OPT_ADDEXT, 's', - "Additional cert extension key=value pair (may be given more than once)"}, - {"extensions", OPT_EXTENSIONS, 's', - "Cert extension section (override value in config file)"}, - {"reqexts", OPT_REQEXTS, 's', - "Request extension section (override value in config file)"}, - {"precert", OPT_PRECERT, '-', "Add a poison extension (implies -new)"}, - {"", OPT_MD, '-', "Any supported digest"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, - {"keygen_engine", OPT_KEYGEN_ENGINE, 's', - "Specify engine to be used for key generation operations"}, -#endif - {NULL} -}; - - -/* - * An LHASH of strings, where each string is an extension name. - */ -static unsigned long ext_name_hash(const OPENSSL_STRING *a) -{ - return OPENSSL_LH_strhash((const char *)a); -} - -static int ext_name_cmp(const OPENSSL_STRING *a, const OPENSSL_STRING *b) -{ - return strcmp((const char *)a, (const char *)b); -} - -static void exts_cleanup(OPENSSL_STRING *x) -{ - OPENSSL_free((char *)x); -} - -/* - * Is the |kv| key already duplicated? This is remarkably tricky to get - * right. Return 0 if unique, -1 on runtime error; 1 if found or a syntax - * error. - */ -static int duplicated(LHASH_OF(OPENSSL_STRING) *addexts, char *kv) -{ - char *p; - size_t off; - - /* Check syntax. */ - /* Skip leading whitespace, make a copy. */ - while (*kv && isspace(*kv)) - if (*++kv == '\0') - return 1; - if ((p = strchr(kv, '=')) == NULL) - return 1; - off = p - kv; - if ((kv = OPENSSL_strdup(kv)) == NULL) - return -1; - - /* Skip trailing space before the equal sign. */ - for (p = kv + off; p > kv; --p) - if (!isspace(p[-1])) - break; - if (p == kv) { - OPENSSL_free(kv); - return 1; - } - *p = '\0'; - - /* Finally have a clean "key"; see if it's there [by attempt to add it]. */ - p = (char *)lh_OPENSSL_STRING_insert(addexts, (OPENSSL_STRING*)kv); - if (p != NULL) { - OPENSSL_free(p); - return 1; - } else if (lh_OPENSSL_STRING_error(addexts)) { - OPENSSL_free(kv); - return -1; - } - - return 0; -} - -int req_main(int argc, char **argv) -{ - ASN1_INTEGER *serial = NULL; - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL, *gen_eng = NULL; - EVP_PKEY *pkey = NULL; - EVP_PKEY_CTX *genctx = NULL; - STACK_OF(OPENSSL_STRING) *pkeyopts = NULL, *sigopts = NULL; - LHASH_OF(OPENSSL_STRING) *addexts = NULL; - X509 *x509ss = NULL; - X509_REQ *req = NULL; - const EVP_CIPHER *cipher = NULL; - const EVP_MD *md_alg = NULL, *digest = NULL; - BIO *addext_bio = NULL; - char *extensions = NULL, *infile = NULL; - char *outfile = NULL, *keyfile = NULL; - char *keyalgstr = NULL, *p, *prog, *passargin = NULL, *passargout = NULL; - char *passin = NULL, *passout = NULL; - char *nofree_passin = NULL, *nofree_passout = NULL; - char *req_exts = NULL, *subj = NULL; - char *template = default_config_file, *keyout = NULL; - const char *keyalg = NULL; - OPTION_CHOICE o; - int ret = 1, x509 = 0, days = 0, i = 0, newreq = 0, verbose = 0; - int pkey_type = -1, private = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, keyform = FORMAT_PEM; - int modulus = 0, multirdn = 0, verify = 0, noout = 0, text = 0; - int nodes = 0, newhdr = 0, subject = 0, pubkey = 0, precert = 0; - long newkey = -1; - unsigned long chtype = MBSTRING_ASC, reqflag = 0; - -#ifndef OPENSSL_NO_DES - cipher = EVP_des_ede3_cbc(); -#endif - - prog = opt_init(argc, argv, req_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(req_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &outformat)) - goto opthelp; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_KEYGEN_ENGINE: -#ifndef OPENSSL_NO_ENGINE - gen_eng = ENGINE_by_id(opt_arg()); - if (gen_eng == NULL) { - BIO_printf(bio_err, "Can't find keygen engine %s\n", *argv); - goto opthelp; - } -#endif - break; - case OPT_KEY: - keyfile = opt_arg(); - break; - case OPT_PUBKEY: - pubkey = 1; - break; - case OPT_NEW: - newreq = 1; - break; - case OPT_CONFIG: - template = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyform)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_KEYOUT: - keyout = opt_arg(); - break; - case OPT_PASSIN: - passargin = opt_arg(); - break; - case OPT_PASSOUT: - passargout = opt_arg(); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_NEWKEY: - keyalg = opt_arg(); - newreq = 1; - break; - case OPT_PKEYOPT: - if (!pkeyopts) - pkeyopts = sk_OPENSSL_STRING_new_null(); - if (!pkeyopts || !sk_OPENSSL_STRING_push(pkeyopts, opt_arg())) - goto opthelp; - break; - case OPT_SIGOPT: - if (!sigopts) - sigopts = sk_OPENSSL_STRING_new_null(); - if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, opt_arg())) - goto opthelp; - break; - case OPT_BATCH: - batch = 1; - break; - case OPT_NEWHDR: - newhdr = 1; - break; - case OPT_MODULUS: - modulus = 1; - break; - case OPT_VERIFY: - verify = 1; - break; - case OPT_NODES: - nodes = 1; - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_VERBOSE: - verbose = 1; - break; - case OPT_UTF8: - chtype = MBSTRING_UTF8; - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto opthelp; - break; - case OPT_REQOPT: - if (!set_cert_ex(&reqflag, opt_arg())) - goto opthelp; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_X509: - x509 = 1; - break; - case OPT_DAYS: - days = atoi(opt_arg()); - break; - case OPT_SET_SERIAL: - if (serial != NULL) { - BIO_printf(bio_err, "Serial number supplied twice\n"); - goto opthelp; - } - serial = s2i_ASN1_INTEGER(NULL, opt_arg()); - if (serial == NULL) - goto opthelp; - break; - case OPT_SUBJECT: - subject = 1; - break; - case OPT_SUBJ: - subj = opt_arg(); - break; - case OPT_MULTIVALUE_RDN: - multirdn = 1; - break; - case OPT_ADDEXT: - p = opt_arg(); - if (addexts == NULL) { - addexts = lh_OPENSSL_STRING_new(ext_name_hash, ext_name_cmp); - addext_bio = BIO_new(BIO_s_mem()); - if (addexts == NULL || addext_bio == NULL) - goto end; - } - i = duplicated(addexts, p); - if (i == 1) - goto opthelp; - if (i < 0 || BIO_printf(addext_bio, "%s\n", opt_arg()) < 0) - goto end; - break; - case OPT_EXTENSIONS: - extensions = opt_arg(); - break; - case OPT_REQEXTS: - req_exts = opt_arg(); - break; - case OPT_PRECERT: - newreq = precert = 1; - break; - case OPT_MD: - if (!opt_md(opt_unknown(), &md_alg)) - goto opthelp; - digest = md_alg; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (days && !x509) - BIO_printf(bio_err, "Ignoring -days; not generating a certificate\n"); - if (x509 && infile == NULL) - newreq = 1; - - /* TODO: simplify this as pkey is still always NULL here */ - private = newreq && (pkey == NULL) ? 1 : 0; - - if (!app_passwd(passargin, passargout, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - if (verbose) - BIO_printf(bio_err, "Using configuration from %s\n", template); - if ((req_conf = app_load_config(template)) == NULL) - goto end; - if (addext_bio) { - if (verbose) - BIO_printf(bio_err, - "Using additional configuration from command line\n"); - if ((addext_conf = app_load_config_bio(addext_bio, NULL)) == NULL) - goto end; - } - if (template != default_config_file && !app_load_modules(req_conf)) - goto end; - - if (req_conf != NULL) { - p = NCONF_get_string(req_conf, NULL, "oid_file"); - if (p == NULL) - ERR_clear_error(); - if (p != NULL) { - BIO *oid_bio; - - oid_bio = BIO_new_file(p, "r"); - if (oid_bio == NULL) { - /*- - BIO_printf(bio_err,"problems opening %s for extra oid's\n",p); - ERR_print_errors(bio_err); - */ - } else { - OBJ_create_objects(oid_bio); - BIO_free(oid_bio); - } - } - } - if (!add_oid_section(req_conf)) - goto end; - - if (md_alg == NULL) { - p = NCONF_get_string(req_conf, SECTION, "default_md"); - if (p == NULL) { - ERR_clear_error(); - } else { - if (!opt_md(p, &md_alg)) - goto opthelp; - digest = md_alg; - } - } - - if (extensions == NULL) { - extensions = NCONF_get_string(req_conf, SECTION, V3_EXTENSIONS); - if (extensions == NULL) - ERR_clear_error(); - } - if (extensions != NULL) { - /* Check syntax of file */ - X509V3_CTX ctx; - X509V3_set_ctx_test(&ctx); - X509V3_set_nconf(&ctx, req_conf); - if (!X509V3_EXT_add_nconf(req_conf, &ctx, extensions, NULL)) { - BIO_printf(bio_err, - "Error Loading extension section %s\n", extensions); - goto end; - } - } - if (addext_conf != NULL) { - /* Check syntax of command line extensions */ - X509V3_CTX ctx; - X509V3_set_ctx_test(&ctx); - X509V3_set_nconf(&ctx, addext_conf); - if (!X509V3_EXT_add_nconf(addext_conf, &ctx, "default", NULL)) { - BIO_printf(bio_err, "Error Loading command line extensions\n"); - goto end; - } - } - - if (passin == NULL) { - passin = nofree_passin = - NCONF_get_string(req_conf, SECTION, "input_password"); - if (passin == NULL) - ERR_clear_error(); - } - - if (passout == NULL) { - passout = nofree_passout = - NCONF_get_string(req_conf, SECTION, "output_password"); - if (passout == NULL) - ERR_clear_error(); - } - - p = NCONF_get_string(req_conf, SECTION, STRING_MASK); - if (p == NULL) - ERR_clear_error(); - - if (p != NULL && !ASN1_STRING_set_default_mask_asc(p)) { - BIO_printf(bio_err, "Invalid global string mask setting %s\n", p); - goto end; - } - - if (chtype != MBSTRING_UTF8) { - p = NCONF_get_string(req_conf, SECTION, UTF8_IN); - if (p == NULL) - ERR_clear_error(); - else if (strcmp(p, "yes") == 0) - chtype = MBSTRING_UTF8; - } - - if (req_exts == NULL) { - req_exts = NCONF_get_string(req_conf, SECTION, REQ_EXTENSIONS); - if (req_exts == NULL) - ERR_clear_error(); - } - if (req_exts != NULL) { - /* Check syntax of file */ - X509V3_CTX ctx; - X509V3_set_ctx_test(&ctx); - X509V3_set_nconf(&ctx, req_conf); - if (!X509V3_EXT_add_nconf(req_conf, &ctx, req_exts, NULL)) { - BIO_printf(bio_err, - "Error Loading request extension section %s\n", - req_exts); - goto end; - } - } - - if (keyfile != NULL) { - pkey = load_key(keyfile, keyform, 0, passin, e, "Private Key"); - if (pkey == NULL) { - /* load_key() has already printed an appropriate message */ - goto end; - } else { - app_RAND_load_conf(req_conf, SECTION); - } - } - - if (newreq && (pkey == NULL)) { - app_RAND_load_conf(req_conf, SECTION); - - if (!NCONF_get_number(req_conf, SECTION, BITS, &newkey)) { - newkey = DEFAULT_KEY_LENGTH; - } - - if (keyalg != NULL) { - genctx = set_keygen_ctx(keyalg, &pkey_type, &newkey, - &keyalgstr, gen_eng); - if (genctx == NULL) - goto end; - } - - if (newkey < MIN_KEY_LENGTH - && (pkey_type == EVP_PKEY_RSA || pkey_type == EVP_PKEY_DSA)) { - BIO_printf(bio_err, "private key length is too short,\n"); - BIO_printf(bio_err, "it needs to be at least %d bits, not %ld\n", - MIN_KEY_LENGTH, newkey); - goto end; - } - - if (pkey_type == EVP_PKEY_RSA && newkey > OPENSSL_RSA_MAX_MODULUS_BITS) - BIO_printf(bio_err, - "Warning: It is not recommended to use more than %d bit for RSA keys.\n" - " Your key size is %ld! Larger key size may behave not as expected.\n", - OPENSSL_RSA_MAX_MODULUS_BITS, newkey); - -#ifndef OPENSSL_NO_DSA - if (pkey_type == EVP_PKEY_DSA && newkey > OPENSSL_DSA_MAX_MODULUS_BITS) - BIO_printf(bio_err, - "Warning: It is not recommended to use more than %d bit for DSA keys.\n" - " Your key size is %ld! Larger key size may behave not as expected.\n", - OPENSSL_DSA_MAX_MODULUS_BITS, newkey); -#endif - - if (genctx == NULL) { - genctx = set_keygen_ctx(NULL, &pkey_type, &newkey, - &keyalgstr, gen_eng); - if (!genctx) - goto end; - } - - if (pkeyopts != NULL) { - char *genopt; - for (i = 0; i < sk_OPENSSL_STRING_num(pkeyopts); i++) { - genopt = sk_OPENSSL_STRING_value(pkeyopts, i); - if (pkey_ctrl_string(genctx, genopt) <= 0) { - BIO_printf(bio_err, "parameter error \"%s\"\n", genopt); - ERR_print_errors(bio_err); - goto end; - } - } - } - - if (pkey_type == EVP_PKEY_EC) { - BIO_printf(bio_err, "Generating an EC private key\n"); - } else { - BIO_printf(bio_err, "Generating a %s private key\n", keyalgstr); - } - - EVP_PKEY_CTX_set_cb(genctx, genpkey_cb); - EVP_PKEY_CTX_set_app_data(genctx, bio_err); - - if (EVP_PKEY_keygen(genctx, &pkey) <= 0) { - BIO_puts(bio_err, "Error Generating Key\n"); - goto end; - } - - EVP_PKEY_CTX_free(genctx); - genctx = NULL; - - if (keyout == NULL) { - keyout = NCONF_get_string(req_conf, SECTION, KEYFILE); - if (keyout == NULL) - ERR_clear_error(); - } - - if (keyout == NULL) - BIO_printf(bio_err, "writing new private key to stdout\n"); - else - BIO_printf(bio_err, "writing new private key to '%s'\n", keyout); - out = bio_open_owner(keyout, outformat, private); - if (out == NULL) - goto end; - - p = NCONF_get_string(req_conf, SECTION, "encrypt_rsa_key"); - if (p == NULL) { - ERR_clear_error(); - p = NCONF_get_string(req_conf, SECTION, "encrypt_key"); - if (p == NULL) - ERR_clear_error(); - } - if ((p != NULL) && (strcmp(p, "no") == 0)) - cipher = NULL; - if (nodes) - cipher = NULL; - - i = 0; - loop: - assert(private); - if (!PEM_write_bio_PrivateKey(out, pkey, cipher, - NULL, 0, NULL, passout)) { - if ((ERR_GET_REASON(ERR_peek_error()) == - PEM_R_PROBLEMS_GETTING_PASSWORD) && (i < 3)) { - ERR_clear_error(); - i++; - goto loop; - } - goto end; - } - BIO_free(out); - out = NULL; - BIO_printf(bio_err, "-----\n"); - } - - if (!newreq) { - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - - if (informat == FORMAT_ASN1) - req = d2i_X509_REQ_bio(in, NULL); - else - req = PEM_read_bio_X509_REQ(in, NULL, NULL, NULL); - if (req == NULL) { - BIO_printf(bio_err, "unable to load X509 request\n"); - goto end; - } - } - - if (newreq || x509) { - if (pkey == NULL) { - BIO_printf(bio_err, "you need to specify a private key\n"); - goto end; - } - - if (req == NULL) { - req = X509_REQ_new(); - if (req == NULL) { - goto end; - } - - i = make_REQ(req, pkey, subj, multirdn, !x509, chtype); - subj = NULL; /* done processing '-subj' option */ - if (!i) { - BIO_printf(bio_err, "problems making Certificate Request\n"); - goto end; - } - } - if (x509) { - EVP_PKEY *tmppkey; - X509V3_CTX ext_ctx; - if ((x509ss = X509_new()) == NULL) - goto end; - - /* Set version to V3 */ - if ((extensions != NULL || addext_conf != NULL) - && !X509_set_version(x509ss, 2)) - goto end; - if (serial != NULL) { - if (!X509_set_serialNumber(x509ss, serial)) - goto end; - } else { - if (!rand_serial(NULL, X509_get_serialNumber(x509ss))) - goto end; - } - - if (!X509_set_issuer_name(x509ss, X509_REQ_get_subject_name(req))) - goto end; - if (days == 0) { - /* set default days if it's not specified */ - days = 30; - } - if (!set_cert_times(x509ss, NULL, NULL, days)) - goto end; - if (!X509_set_subject_name - (x509ss, X509_REQ_get_subject_name(req))) - goto end; - tmppkey = X509_REQ_get0_pubkey(req); - if (!tmppkey || !X509_set_pubkey(x509ss, tmppkey)) - goto end; - - /* Set up V3 context struct */ - - X509V3_set_ctx(&ext_ctx, x509ss, x509ss, NULL, NULL, 0); - X509V3_set_nconf(&ext_ctx, req_conf); - - /* Add extensions */ - if (extensions != NULL && !X509V3_EXT_add_nconf(req_conf, - &ext_ctx, extensions, - x509ss)) { - BIO_printf(bio_err, "Error Loading extension section %s\n", - extensions); - goto end; - } - if (addext_conf != NULL - && !X509V3_EXT_add_nconf(addext_conf, &ext_ctx, "default", - x509ss)) { - BIO_printf(bio_err, "Error Loading command line extensions\n"); - goto end; - } - - /* If a pre-cert was requested, we need to add a poison extension */ - if (precert) { - if (X509_add1_ext_i2d(x509ss, NID_ct_precert_poison, NULL, 1, 0) - != 1) { - BIO_printf(bio_err, "Error adding poison extension\n"); - goto end; - } - } - - i = do_X509_sign(x509ss, pkey, digest, sigopts); - if (!i) { - ERR_print_errors(bio_err); - goto end; - } - } else { - X509V3_CTX ext_ctx; - - /* Set up V3 context struct */ - - X509V3_set_ctx(&ext_ctx, NULL, NULL, req, NULL, 0); - X509V3_set_nconf(&ext_ctx, req_conf); - - /* Add extensions */ - if (req_exts != NULL - && !X509V3_EXT_REQ_add_nconf(req_conf, &ext_ctx, - req_exts, req)) { - BIO_printf(bio_err, "Error Loading extension section %s\n", - req_exts); - goto end; - } - if (addext_conf != NULL - && !X509V3_EXT_REQ_add_nconf(addext_conf, &ext_ctx, "default", - req)) { - BIO_printf(bio_err, "Error Loading command line extensions\n"); - goto end; - } - i = do_X509_REQ_sign(req, pkey, digest, sigopts); - if (!i) { - ERR_print_errors(bio_err); - goto end; - } - } - } - - if (subj && x509) { - BIO_printf(bio_err, "Cannot modify certificate subject\n"); - goto end; - } - - if (subj && !x509) { - if (verbose) { - BIO_printf(bio_err, "Modifying Request's Subject\n"); - print_name(bio_err, "old subject=", - X509_REQ_get_subject_name(req), get_nameopt()); - } - - if (build_subject(req, subj, chtype, multirdn) == 0) { - BIO_printf(bio_err, "ERROR: cannot modify subject\n"); - ret = 1; - goto end; - } - - if (verbose) { - print_name(bio_err, "new subject=", - X509_REQ_get_subject_name(req), get_nameopt()); - } - } - - if (verify && !x509) { - EVP_PKEY *tpubkey = pkey; - - if (tpubkey == NULL) { - tpubkey = X509_REQ_get0_pubkey(req); - if (tpubkey == NULL) - goto end; - } - - i = X509_REQ_verify(req, tpubkey); - - if (i < 0) { - goto end; - } else if (i == 0) { - BIO_printf(bio_err, "verify failure\n"); - ERR_print_errors(bio_err); - } else { /* if (i > 0) */ - BIO_printf(bio_err, "verify OK\n"); - } - } - - if (noout && !text && !modulus && !subject && !pubkey) { - ret = 0; - goto end; - } - - out = bio_open_default(outfile, - keyout != NULL && outfile != NULL && - strcmp(keyout, outfile) == 0 ? 'a' : 'w', - outformat); - if (out == NULL) - goto end; - - if (pubkey) { - EVP_PKEY *tpubkey = X509_REQ_get0_pubkey(req); - - if (tpubkey == NULL) { - BIO_printf(bio_err, "Error getting public key\n"); - ERR_print_errors(bio_err); - goto end; - } - PEM_write_bio_PUBKEY(out, tpubkey); - } - - if (text) { - if (x509) - ret = X509_print_ex(out, x509ss, get_nameopt(), reqflag); - else - ret = X509_REQ_print_ex(out, req, get_nameopt(), reqflag); - - if (ret == 0) { - if (x509) - BIO_printf(bio_err, "Error printing certificate\n"); - else - BIO_printf(bio_err, "Error printing certificate request\n"); - - ERR_print_errors(bio_err); - goto end; - } - } - - if (subject) { - if (x509) - print_name(out, "subject=", X509_get_subject_name(x509ss), - get_nameopt()); - else - print_name(out, "subject=", X509_REQ_get_subject_name(req), - get_nameopt()); - } - - if (modulus) { - EVP_PKEY *tpubkey; - - if (x509) - tpubkey = X509_get0_pubkey(x509ss); - else - tpubkey = X509_REQ_get0_pubkey(req); - if (tpubkey == NULL) { - fprintf(stdout, "Modulus=unavailable\n"); - goto end; - } - fprintf(stdout, "Modulus="); -#ifndef OPENSSL_NO_RSA - if (EVP_PKEY_base_id(tpubkey) == EVP_PKEY_RSA) { - const BIGNUM *n; - RSA_get0_key(EVP_PKEY_get0_RSA(tpubkey), &n, NULL, NULL); - BN_print(out, n); - } else -#endif - fprintf(stdout, "Wrong Algorithm type"); - fprintf(stdout, "\n"); - } - - if (!noout && !x509) { - if (outformat == FORMAT_ASN1) - i = i2d_X509_REQ_bio(out, req); - else if (newhdr) - i = PEM_write_bio_X509_REQ_NEW(out, req); - else - i = PEM_write_bio_X509_REQ(out, req); - if (!i) { - BIO_printf(bio_err, "unable to write X509 request\n"); - goto end; - } - } - if (!noout && x509 && (x509ss != NULL)) { - if (outformat == FORMAT_ASN1) - i = i2d_X509_bio(out, x509ss); - else - i = PEM_write_bio_X509(out, x509ss); - if (!i) { - BIO_printf(bio_err, "unable to write X509 certificate\n"); - goto end; - } - } - ret = 0; - end: - if (ret) { - ERR_print_errors(bio_err); - } - NCONF_free(req_conf); - NCONF_free(addext_conf); - BIO_free(addext_bio); - BIO_free(in); - BIO_free_all(out); - EVP_PKEY_free(pkey); - EVP_PKEY_CTX_free(genctx); - sk_OPENSSL_STRING_free(pkeyopts); - sk_OPENSSL_STRING_free(sigopts); - lh_OPENSSL_STRING_doall(addexts, exts_cleanup); - lh_OPENSSL_STRING_free(addexts); -#ifndef OPENSSL_NO_ENGINE - ENGINE_free(gen_eng); -#endif - OPENSSL_free(keyalgstr); - X509_REQ_free(req); - X509_free(x509ss); - ASN1_INTEGER_free(serial); - release_engine(e); - if (passin != nofree_passin) - OPENSSL_free(passin); - if (passout != nofree_passout) - OPENSSL_free(passout); - return ret; -} - -static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, char *subj, int multirdn, - int attribs, unsigned long chtype) -{ - int ret = 0, i; - char no_prompt = 0; - STACK_OF(CONF_VALUE) *dn_sk, *attr_sk = NULL; - char *tmp, *dn_sect, *attr_sect; - - tmp = NCONF_get_string(req_conf, SECTION, PROMPT); - if (tmp == NULL) - ERR_clear_error(); - if ((tmp != NULL) && strcmp(tmp, "no") == 0) - no_prompt = 1; - - dn_sect = NCONF_get_string(req_conf, SECTION, DISTINGUISHED_NAME); - if (dn_sect == NULL) { - BIO_printf(bio_err, "unable to find '%s' in config\n", - DISTINGUISHED_NAME); - goto err; - } - dn_sk = NCONF_get_section(req_conf, dn_sect); - if (dn_sk == NULL) { - BIO_printf(bio_err, "unable to get '%s' section\n", dn_sect); - goto err; - } - - attr_sect = NCONF_get_string(req_conf, SECTION, ATTRIBUTES); - if (attr_sect == NULL) { - ERR_clear_error(); - attr_sk = NULL; - } else { - attr_sk = NCONF_get_section(req_conf, attr_sect); - if (attr_sk == NULL) { - BIO_printf(bio_err, "unable to get '%s' section\n", attr_sect); - goto err; - } - } - - /* setup version number */ - if (!X509_REQ_set_version(req, 0L)) - goto err; /* version 1 */ - - if (subj) - i = build_subject(req, subj, chtype, multirdn); - else if (no_prompt) - i = auto_info(req, dn_sk, attr_sk, attribs, chtype); - else - i = prompt_info(req, dn_sk, dn_sect, attr_sk, attr_sect, attribs, - chtype); - if (!i) - goto err; - - if (!X509_REQ_set_pubkey(req, pkey)) - goto err; - - ret = 1; - err: - return ret; -} - -/* - * subject is expected to be in the format /type0=value0/type1=value1/type2=... - * where characters may be escaped by \ - */ -static int build_subject(X509_REQ *req, const char *subject, unsigned long chtype, - int multirdn) -{ - X509_NAME *n; - - if ((n = parse_name(subject, chtype, multirdn)) == NULL) - return 0; - - if (!X509_REQ_set_subject_name(req, n)) { - X509_NAME_free(n); - return 0; - } - X509_NAME_free(n); - return 1; -} - -static int prompt_info(X509_REQ *req, - STACK_OF(CONF_VALUE) *dn_sk, const char *dn_sect, - STACK_OF(CONF_VALUE) *attr_sk, const char *attr_sect, - int attribs, unsigned long chtype) -{ - int i; - char *p, *q; - char buf[100]; - int nid, mval; - long n_min, n_max; - char *type, *value; - const char *def; - CONF_VALUE *v; - X509_NAME *subj; - subj = X509_REQ_get_subject_name(req); - - if (!batch) { - BIO_printf(bio_err, - "You are about to be asked to enter information that will be incorporated\n"); - BIO_printf(bio_err, "into your certificate request.\n"); - BIO_printf(bio_err, - "What you are about to enter is what is called a Distinguished Name or a DN.\n"); - BIO_printf(bio_err, - "There are quite a few fields but you can leave some blank\n"); - BIO_printf(bio_err, - "For some fields there will be a default value,\n"); - BIO_printf(bio_err, - "If you enter '.', the field will be left blank.\n"); - BIO_printf(bio_err, "-----\n"); - } - - if (sk_CONF_VALUE_num(dn_sk)) { - i = -1; - start: - for ( ; ; ) { - i++; - if (sk_CONF_VALUE_num(dn_sk) <= i) - break; - - v = sk_CONF_VALUE_value(dn_sk, i); - p = q = NULL; - type = v->name; - if (!check_end(type, "_min") || !check_end(type, "_max") || - !check_end(type, "_default") || !check_end(type, "_value")) - continue; - /* - * Skip past any leading X. X: X, etc to allow for multiple - * instances - */ - for (p = v->name; *p; p++) - if ((*p == ':') || (*p == ',') || (*p == '.')) { - p++; - if (*p) - type = p; - break; - } - if (*type == '+') { - mval = -1; - type++; - } else { - mval = 0; - } - /* If OBJ not recognised ignore it */ - if ((nid = OBJ_txt2nid(type)) == NID_undef) - goto start; - if (!join(buf, sizeof(buf), v->name, "_default", "Name")) - return 0; - if ((def = NCONF_get_string(req_conf, dn_sect, buf)) == NULL) { - ERR_clear_error(); - def = ""; - } - - if (!join(buf, sizeof(buf), v->name, "_value", "Name")) - return 0; - if ((value = NCONF_get_string(req_conf, dn_sect, buf)) == NULL) { - ERR_clear_error(); - value = NULL; - } - - if (!join(buf, sizeof(buf), v->name, "_min", "Name")) - return 0; - if (!NCONF_get_number(req_conf, dn_sect, buf, &n_min)) { - ERR_clear_error(); - n_min = -1; - } - - - if (!join(buf, sizeof(buf), v->name, "_max", "Name")) - return 0; - if (!NCONF_get_number(req_conf, dn_sect, buf, &n_max)) { - ERR_clear_error(); - n_max = -1; - } - - if (!add_DN_object(subj, v->value, def, value, nid, - n_min, n_max, chtype, mval)) - return 0; - } - if (X509_NAME_entry_count(subj) == 0) { - BIO_printf(bio_err, - "error, no objects specified in config file\n"); - return 0; - } - - if (attribs) { - if ((attr_sk != NULL) && (sk_CONF_VALUE_num(attr_sk) > 0) - && (!batch)) { - BIO_printf(bio_err, - "\nPlease enter the following 'extra' attributes\n"); - BIO_printf(bio_err, - "to be sent with your certificate request\n"); - } - - i = -1; - start2: - for ( ; ; ) { - i++; - if ((attr_sk == NULL) || (sk_CONF_VALUE_num(attr_sk) <= i)) - break; - - v = sk_CONF_VALUE_value(attr_sk, i); - type = v->name; - if ((nid = OBJ_txt2nid(type)) == NID_undef) - goto start2; - - if (!join(buf, sizeof(buf), type, "_default", "Name")) - return 0; - if ((def = NCONF_get_string(req_conf, attr_sect, buf)) - == NULL) { - ERR_clear_error(); - def = ""; - } - - if (!join(buf, sizeof(buf), type, "_value", "Name")) - return 0; - if ((value = NCONF_get_string(req_conf, attr_sect, buf)) - == NULL) { - ERR_clear_error(); - value = NULL; - } - - if (!join(buf, sizeof(buf), type,"_min", "Name")) - return 0; - if (!NCONF_get_number(req_conf, attr_sect, buf, &n_min)) { - ERR_clear_error(); - n_min = -1; - } - - if (!join(buf, sizeof(buf), type, "_max", "Name")) - return 0; - if (!NCONF_get_number(req_conf, attr_sect, buf, &n_max)) { - ERR_clear_error(); - n_max = -1; - } - - if (!add_attribute_object(req, - v->value, def, value, nid, n_min, - n_max, chtype)) - return 0; - } - } - } else { - BIO_printf(bio_err, "No template, please set one up.\n"); - return 0; - } - - return 1; - -} - -static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk, - STACK_OF(CONF_VALUE) *attr_sk, int attribs, - unsigned long chtype) -{ - int i, spec_char, plus_char; - char *p, *q; - char *type; - CONF_VALUE *v; - X509_NAME *subj; - - subj = X509_REQ_get_subject_name(req); - - for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) { - int mval; - v = sk_CONF_VALUE_value(dn_sk, i); - p = q = NULL; - type = v->name; - /* - * Skip past any leading X. X: X, etc to allow for multiple instances - */ - for (p = v->name; *p; p++) { -#ifndef CHARSET_EBCDIC - spec_char = ((*p == ':') || (*p == ',') || (*p == '.')); -#else - spec_char = ((*p == os_toascii[':']) || (*p == os_toascii[',']) - || (*p == os_toascii['.'])); -#endif - if (spec_char) { - p++; - if (*p) - type = p; - break; - } - } -#ifndef CHARSET_EBCDIC - plus_char = (*type == '+'); -#else - plus_char = (*type == os_toascii['+']); -#endif - if (plus_char) { - type++; - mval = -1; - } else { - mval = 0; - } - if (!X509_NAME_add_entry_by_txt(subj, type, chtype, - (unsigned char *)v->value, -1, -1, - mval)) - return 0; - - } - - if (!X509_NAME_entry_count(subj)) { - BIO_printf(bio_err, "error, no objects specified in config file\n"); - return 0; - } - if (attribs) { - for (i = 0; i < sk_CONF_VALUE_num(attr_sk); i++) { - v = sk_CONF_VALUE_value(attr_sk, i); - if (!X509_REQ_add1_attr_by_txt(req, v->name, chtype, - (unsigned char *)v->value, -1)) - return 0; - } - } - return 1; -} - -static int add_DN_object(X509_NAME *n, char *text, const char *def, - char *value, int nid, int n_min, int n_max, - unsigned long chtype, int mval) -{ - int ret = 0; - char buf[1024]; - - ret = build_data(text, def, value, n_min, n_max, buf, sizeof(buf), - "DN value", "DN default"); - if ((ret == 0) || (ret == 1)) - return ret; - ret = 1; - - if (!X509_NAME_add_entry_by_NID(n, nid, chtype, - (unsigned char *)buf, -1, -1, mval)) - ret = 0; - - return ret; -} - -static int add_attribute_object(X509_REQ *req, char *text, const char *def, - char *value, int nid, int n_min, - int n_max, unsigned long chtype) -{ - int ret = 0; - char buf[1024]; - - ret = build_data(text, def, value, n_min, n_max, buf, sizeof(buf), - "Attribute value", "Attribute default"); - if ((ret == 0) || (ret == 1)) - return ret; - ret = 1; - - if (!X509_REQ_add1_attr_by_NID(req, nid, chtype, - (unsigned char *)buf, -1)) { - BIO_printf(bio_err, "Error adding attribute\n"); - ERR_print_errors(bio_err); - ret = 0; - } - - return ret; -} - - -static int build_data(char *text, const char *def, - char *value, int n_min, int n_max, - char *buf, const int buf_size, - const char *desc1, const char *desc2 - ) -{ - int i; - start: - if (!batch) - BIO_printf(bio_err, "%s [%s]:", text, def); - (void)BIO_flush(bio_err); - if (value != NULL) { - if (!join(buf, buf_size, value, "\n", desc1)) - return 0; - BIO_printf(bio_err, "%s\n", value); - } else { - buf[0] = '\0'; - if (!batch) { - if (!fgets(buf, buf_size, stdin)) - return 0; - } else { - buf[0] = '\n'; - buf[1] = '\0'; - } - } - - if (buf[0] == '\0') - return 0; - if (buf[0] == '\n') { - if ((def == NULL) || (def[0] == '\0')) - return 1; - if (!join(buf, buf_size, def, "\n", desc2)) - return 0; - } else if ((buf[0] == '.') && (buf[1] == '\n')) { - return 1; - } - - i = strlen(buf); - if (buf[i - 1] != '\n') { - BIO_printf(bio_err, "weird input :-(\n"); - return 0; - } - buf[--i] = '\0'; -#ifdef CHARSET_EBCDIC - ebcdic2ascii(buf, buf, i); -#endif - if (!req_check_len(i, n_min, n_max)) { - if (batch || value) - return 0; - goto start; - } - return 2; -} - -static int req_check_len(int len, int n_min, int n_max) -{ - if ((n_min > 0) && (len < n_min)) { - BIO_printf(bio_err, - "string is too short, it needs to be at least %d bytes long\n", - n_min); - return 0; - } - if ((n_max >= 0) && (len > n_max)) { - BIO_printf(bio_err, - "string is too long, it needs to be no more than %d bytes long\n", - n_max); - return 0; - } - return 1; -} - -/* Check if the end of a string matches 'end' */ -static int check_end(const char *str, const char *end) -{ - size_t elen, slen; - const char *tmp; - - elen = strlen(end); - slen = strlen(str); - if (elen > slen) - return 1; - tmp = str + slen - elen; - return strcmp(tmp, end); -} - -/* - * Merge the two strings together into the result buffer checking for - * overflow and producing an error message if there is. - */ -static int join(char buf[], size_t buf_size, const char *name, - const char *tail, const char *desc) -{ - const size_t name_len = strlen(name), tail_len = strlen(tail); - - if (name_len + tail_len + 1 > buf_size) { - BIO_printf(bio_err, "%s '%s' too long\n", desc, name); - return 0; - } - memcpy(buf, name, name_len); - memcpy(buf + name_len, tail, tail_len + 1); - return 1; -} - -static EVP_PKEY_CTX *set_keygen_ctx(const char *gstr, - int *pkey_type, long *pkeylen, - char **palgnam, ENGINE *keygen_engine) -{ - EVP_PKEY_CTX *gctx = NULL; - EVP_PKEY *param = NULL; - long keylen = -1; - BIO *pbio = NULL; - const char *paramfile = NULL; - - if (gstr == NULL) { - *pkey_type = EVP_PKEY_RSA; - keylen = *pkeylen; - } else if (gstr[0] >= '0' && gstr[0] <= '9') { - *pkey_type = EVP_PKEY_RSA; - keylen = atol(gstr); - *pkeylen = keylen; - } else if (strncmp(gstr, "param:", 6) == 0) { - paramfile = gstr + 6; - } else { - const char *p = strchr(gstr, ':'); - int len; - ENGINE *tmpeng; - const EVP_PKEY_ASN1_METHOD *ameth; - - if (p != NULL) - len = p - gstr; - else - len = strlen(gstr); - /* - * The lookup of a the string will cover all engines so keep a note - * of the implementation. - */ - - ameth = EVP_PKEY_asn1_find_str(&tmpeng, gstr, len); - - if (ameth == NULL) { - BIO_printf(bio_err, "Unknown algorithm %.*s\n", len, gstr); - return NULL; - } - - EVP_PKEY_asn1_get0_info(NULL, pkey_type, NULL, NULL, NULL, ameth); -#ifndef OPENSSL_NO_ENGINE - ENGINE_finish(tmpeng); -#endif - if (*pkey_type == EVP_PKEY_RSA) { - if (p != NULL) { - keylen = atol(p + 1); - *pkeylen = keylen; - } else { - keylen = *pkeylen; - } - } else if (p != NULL) { - paramfile = p + 1; - } - } - - if (paramfile != NULL) { - pbio = BIO_new_file(paramfile, "r"); - if (pbio == NULL) { - BIO_printf(bio_err, "Can't open parameter file %s\n", paramfile); - return NULL; - } - param = PEM_read_bio_Parameters(pbio, NULL); - - if (param == NULL) { - X509 *x; - - (void)BIO_reset(pbio); - x = PEM_read_bio_X509(pbio, NULL, NULL, NULL); - if (x != NULL) { - param = X509_get_pubkey(x); - X509_free(x); - } - } - - BIO_free(pbio); - - if (param == NULL) { - BIO_printf(bio_err, "Error reading parameter file %s\n", paramfile); - return NULL; - } - if (*pkey_type == -1) { - *pkey_type = EVP_PKEY_id(param); - } else if (*pkey_type != EVP_PKEY_base_id(param)) { - BIO_printf(bio_err, "Key Type does not match parameters\n"); - EVP_PKEY_free(param); - return NULL; - } - } - - if (palgnam != NULL) { - const EVP_PKEY_ASN1_METHOD *ameth; - ENGINE *tmpeng; - const char *anam; - - ameth = EVP_PKEY_asn1_find(&tmpeng, *pkey_type); - if (ameth == NULL) { - BIO_puts(bio_err, "Internal error: can't find key algorithm\n"); - return NULL; - } - EVP_PKEY_asn1_get0_info(NULL, NULL, NULL, NULL, &anam, ameth); - *palgnam = OPENSSL_strdup(anam); -#ifndef OPENSSL_NO_ENGINE - ENGINE_finish(tmpeng); -#endif - } - - if (param != NULL) { - gctx = EVP_PKEY_CTX_new(param, keygen_engine); - *pkeylen = EVP_PKEY_bits(param); - EVP_PKEY_free(param); - } else { - gctx = EVP_PKEY_CTX_new_id(*pkey_type, keygen_engine); - } - - if (gctx == NULL) { - BIO_puts(bio_err, "Error allocating keygen context\n"); - ERR_print_errors(bio_err); - return NULL; - } - - if (EVP_PKEY_keygen_init(gctx) <= 0) { - BIO_puts(bio_err, "Error initializing keygen context\n"); - ERR_print_errors(bio_err); - EVP_PKEY_CTX_free(gctx); - return NULL; - } -#ifndef OPENSSL_NO_RSA - if ((*pkey_type == EVP_PKEY_RSA) && (keylen != -1)) { - if (EVP_PKEY_CTX_set_rsa_keygen_bits(gctx, keylen) <= 0) { - BIO_puts(bio_err, "Error setting RSA keysize\n"); - ERR_print_errors(bio_err); - EVP_PKEY_CTX_free(gctx); - return NULL; - } - } -#endif - - return gctx; -} - -static int genpkey_cb(EVP_PKEY_CTX *ctx) -{ - char c = '*'; - BIO *b = EVP_PKEY_CTX_get_app_data(ctx); - int p; - p = EVP_PKEY_CTX_get_keygen_info(ctx, 0); - if (p == 0) - c = '.'; - if (p == 1) - c = '+'; - if (p == 2) - c = '*'; - if (p == 3) - c = '\n'; - BIO_write(b, &c, 1); - (void)BIO_flush(b); - return 1; -} - -static int do_sign_init(EVP_MD_CTX *ctx, EVP_PKEY *pkey, - const EVP_MD *md, STACK_OF(OPENSSL_STRING) *sigopts) -{ - EVP_PKEY_CTX *pkctx = NULL; - int i, def_nid; - - if (ctx == NULL) - return 0; - /* - * EVP_PKEY_get_default_digest_nid() returns 2 if the digest is mandatory - * for this algorithm. - */ - if (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) == 2 - && def_nid == NID_undef) { - /* The signing algorithm requires there to be no digest */ - md = NULL; - } - if (!EVP_DigestSignInit(ctx, &pkctx, md, NULL, pkey)) - return 0; - for (i = 0; i < sk_OPENSSL_STRING_num(sigopts); i++) { - char *sigopt = sk_OPENSSL_STRING_value(sigopts, i); - if (pkey_ctrl_string(pkctx, sigopt) <= 0) { - BIO_printf(bio_err, "parameter error \"%s\"\n", sigopt); - ERR_print_errors(bio_err); - return 0; - } - } - return 1; -} - -int do_X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts) -{ - int rv; - EVP_MD_CTX *mctx = EVP_MD_CTX_new(); - - rv = do_sign_init(mctx, pkey, md, sigopts); - if (rv > 0) - rv = X509_sign_ctx(x, mctx); - EVP_MD_CTX_free(mctx); - return rv > 0 ? 1 : 0; -} - -int do_X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts) -{ - int rv; - EVP_MD_CTX *mctx = EVP_MD_CTX_new(); - rv = do_sign_init(mctx, pkey, md, sigopts); - if (rv > 0) - rv = X509_REQ_sign_ctx(x, mctx); - EVP_MD_CTX_free(mctx); - return rv > 0 ? 1 : 0; -} - -int do_X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md, - STACK_OF(OPENSSL_STRING) *sigopts) -{ - int rv; - EVP_MD_CTX *mctx = EVP_MD_CTX_new(); - rv = do_sign_init(mctx, pkey, md, sigopts); - if (rv > 0) - rv = X509_CRL_sign_ctx(x, mctx); - EVP_MD_CTX_free(mctx); - return rv > 0 ? 1 : 0; -} diff --git a/contrib/libs/openssl/apps/rsa.c b/contrib/libs/openssl/apps/rsa.c deleted file mode 100644 index aeda917cc7..0000000000 --- a/contrib/libs/openssl/apps/rsa.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/rsa.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/bn.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_ENGINE, OPT_IN, OPT_OUT, - OPT_PUBIN, OPT_PUBOUT, OPT_PASSOUT, OPT_PASSIN, - OPT_RSAPUBKEY_IN, OPT_RSAPUBKEY_OUT, - /* Do not change the order here; see case statements below */ - OPT_PVK_NONE, OPT_PVK_WEAK, OPT_PVK_STRONG, - OPT_NOOUT, OPT_TEXT, OPT_MODULUS, OPT_CHECK, OPT_CIPHER -} OPTION_CHOICE; - -const OPTIONS rsa_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'f', "Input format, one of DER PEM"}, - {"outform", OPT_OUTFORM, 'f', "Output format, one of DER PEM PVK"}, - {"in", OPT_IN, 's', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"pubin", OPT_PUBIN, '-', "Expect a public key in input file"}, - {"pubout", OPT_PUBOUT, '-', "Output a public key"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"RSAPublicKey_in", OPT_RSAPUBKEY_IN, '-', "Input is an RSAPublicKey"}, - {"RSAPublicKey_out", OPT_RSAPUBKEY_OUT, '-', "Output is an RSAPublicKey"}, - {"noout", OPT_NOOUT, '-', "Don't print key out"}, - {"text", OPT_TEXT, '-', "Print the key in text"}, - {"modulus", OPT_MODULUS, '-', "Print the RSA key modulus"}, - {"check", OPT_CHECK, '-', "Verify key consistency"}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, -#if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4) - {"pvk-strong", OPT_PVK_STRONG, '-', "Enable 'Strong' PVK encoding level (default)"}, - {"pvk-weak", OPT_PVK_WEAK, '-', "Enable 'Weak' PVK encoding level"}, - {"pvk-none", OPT_PVK_NONE, '-', "Don't enforce PVK encoding"}, -#endif -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int rsa_main(int argc, char **argv) -{ - ENGINE *e = NULL; - BIO *out = NULL; - RSA *rsa = NULL; - const EVP_CIPHER *enc = NULL; - char *infile = NULL, *outfile = NULL, *prog; - char *passin = NULL, *passout = NULL, *passinarg = NULL, *passoutarg = NULL; - int i, private = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, text = 0, check = 0; - int noout = 0, modulus = 0, pubin = 0, pubout = 0, ret = 1; -#if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4) - int pvk_encr = 2; -#endif - OPTION_CHOICE o; - - prog = opt_init(argc, argv, rsa_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(rsa_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_PUBIN: - pubin = 1; - break; - case OPT_PUBOUT: - pubout = 1; - break; - case OPT_RSAPUBKEY_IN: - pubin = 2; - break; - case OPT_RSAPUBKEY_OUT: - pubout = 2; - break; - case OPT_PVK_STRONG: /* pvk_encr:= 2 */ - case OPT_PVK_WEAK: /* pvk_encr:= 1 */ - case OPT_PVK_NONE: /* pvk_encr:= 0 */ -#if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4) - pvk_encr = (o - OPT_PVK_NONE); -#endif - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_MODULUS: - modulus = 1; - break; - case OPT_CHECK: - check = 1; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &enc)) - goto opthelp; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - private = (text && !pubin) || (!pubout && !noout) ? 1 : 0; - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - if (check && pubin) { - BIO_printf(bio_err, "Only private keys can be checked\n"); - goto end; - } - - { - EVP_PKEY *pkey; - - if (pubin) { - int tmpformat = -1; - if (pubin == 2) { - if (informat == FORMAT_PEM) - tmpformat = FORMAT_PEMRSA; - else if (informat == FORMAT_ASN1) - tmpformat = FORMAT_ASN1RSA; - } else { - tmpformat = informat; - } - - pkey = load_pubkey(infile, tmpformat, 1, passin, e, "Public Key"); - } else { - pkey = load_key(infile, informat, 1, passin, e, "Private Key"); - } - - if (pkey != NULL) - rsa = EVP_PKEY_get1_RSA(pkey); - EVP_PKEY_free(pkey); - } - - if (rsa == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - out = bio_open_owner(outfile, outformat, private); - if (out == NULL) - goto end; - - if (text) { - assert(pubin || private); - if (!RSA_print(out, rsa, 0)) { - perror(outfile); - ERR_print_errors(bio_err); - goto end; - } - } - - if (modulus) { - const BIGNUM *n; - RSA_get0_key(rsa, &n, NULL, NULL); - BIO_printf(out, "Modulus="); - BN_print(out, n); - BIO_printf(out, "\n"); - } - - if (check) { - int r = RSA_check_key_ex(rsa, NULL); - - if (r == 1) { - BIO_printf(out, "RSA key ok\n"); - } else if (r == 0) { - unsigned long err; - - while ((err = ERR_peek_error()) != 0 && - ERR_GET_LIB(err) == ERR_LIB_RSA && - ERR_GET_FUNC(err) == RSA_F_RSA_CHECK_KEY_EX && - ERR_GET_REASON(err) != ERR_R_MALLOC_FAILURE) { - BIO_printf(out, "RSA key error: %s\n", - ERR_reason_error_string(err)); - ERR_get_error(); /* remove err from error stack */ - } - } else if (r == -1) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (noout) { - ret = 0; - goto end; - } - BIO_printf(bio_err, "writing RSA key\n"); - if (outformat == FORMAT_ASN1) { - if (pubout || pubin) { - if (pubout == 2) - i = i2d_RSAPublicKey_bio(out, rsa); - else - i = i2d_RSA_PUBKEY_bio(out, rsa); - } else { - assert(private); - i = i2d_RSAPrivateKey_bio(out, rsa); - } - } else if (outformat == FORMAT_PEM) { - if (pubout || pubin) { - if (pubout == 2) - i = PEM_write_bio_RSAPublicKey(out, rsa); - else - i = PEM_write_bio_RSA_PUBKEY(out, rsa); - } else { - assert(private); - i = PEM_write_bio_RSAPrivateKey(out, rsa, - enc, NULL, 0, NULL, passout); - } -#ifndef OPENSSL_NO_DSA - } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { - EVP_PKEY *pk; - pk = EVP_PKEY_new(); - if (pk == NULL) - goto end; - - EVP_PKEY_set1_RSA(pk, rsa); - if (outformat == FORMAT_PVK) { - if (pubin) { - BIO_printf(bio_err, "PVK form impossible with public key input\n"); - EVP_PKEY_free(pk); - goto end; - } - assert(private); -# ifdef OPENSSL_NO_RC4 - BIO_printf(bio_err, "PVK format not supported\n"); - EVP_PKEY_free(pk); - goto end; -# else - i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout); -# endif - } else if (pubin || pubout) { - i = i2b_PublicKey_bio(out, pk); - } else { - assert(private); - i = i2b_PrivateKey_bio(out, pk); - } - EVP_PKEY_free(pk); -#endif - } else { - BIO_printf(bio_err, "bad output format specified for outfile\n"); - goto end; - } - if (i <= 0) { - BIO_printf(bio_err, "unable to write key\n"); - ERR_print_errors(bio_err); - } else { - ret = 0; - } - end: - release_engine(e); - BIO_free_all(out); - RSA_free(rsa); - OPENSSL_free(passin); - OPENSSL_free(passout); - return ret; -} diff --git a/contrib/libs/openssl/apps/rsautl.c b/contrib/libs/openssl/apps/rsautl.c deleted file mode 100644 index 0c0fa8eba3..0000000000 --- a/contrib/libs/openssl/apps/rsautl.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include "apps.h" -#include "progs.h" -#include <string.h> -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/rsa.h> - -#define RSA_SIGN 1 -#define RSA_VERIFY 2 -#define RSA_ENCRYPT 3 -#define RSA_DECRYPT 4 - -#define KEY_PRIVKEY 1 -#define KEY_PUBKEY 2 -#define KEY_CERT 3 - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENGINE, OPT_IN, OPT_OUT, OPT_ASN1PARSE, OPT_HEXDUMP, - OPT_RAW, OPT_OAEP, OPT_SSL, OPT_PKCS, OPT_X931, - OPT_SIGN, OPT_VERIFY, OPT_REV, OPT_ENCRYPT, OPT_DECRYPT, - OPT_PUBIN, OPT_CERTIN, OPT_INKEY, OPT_PASSIN, OPT_KEYFORM, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS rsautl_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"inkey", OPT_INKEY, 's', "Input key"}, - {"keyform", OPT_KEYFORM, 'E', "Private key format - default PEM"}, - {"pubin", OPT_PUBIN, '-', "Input is an RSA public"}, - {"certin", OPT_CERTIN, '-', "Input is a cert carrying an RSA public key"}, - {"ssl", OPT_SSL, '-', "Use SSL v2 padding"}, - {"raw", OPT_RAW, '-', "Use no padding"}, - {"pkcs", OPT_PKCS, '-', "Use PKCS#1 v1.5 padding (default)"}, - {"oaep", OPT_OAEP, '-', "Use PKCS#1 OAEP"}, - {"sign", OPT_SIGN, '-', "Sign with private key"}, - {"verify", OPT_VERIFY, '-', "Verify with public key"}, - {"asn1parse", OPT_ASN1PARSE, '-', - "Run output through asn1parse; useful with -verify"}, - {"hexdump", OPT_HEXDUMP, '-', "Hex dump output"}, - {"x931", OPT_X931, '-', "Use ANSI X9.31 padding"}, - {"rev", OPT_REV, '-', "Reverse the order of the input buffer"}, - {"encrypt", OPT_ENCRYPT, '-', "Encrypt with public key"}, - {"decrypt", OPT_DECRYPT, '-', "Decrypt with private key"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int rsautl_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL; - ENGINE *e = NULL; - EVP_PKEY *pkey = NULL; - RSA *rsa = NULL; - X509 *x; - char *infile = NULL, *outfile = NULL, *keyfile = NULL; - char *passinarg = NULL, *passin = NULL, *prog; - char rsa_mode = RSA_VERIFY, key_type = KEY_PRIVKEY; - unsigned char *rsa_in = NULL, *rsa_out = NULL, pad = RSA_PKCS1_PADDING; - int rsa_inlen, keyformat = FORMAT_PEM, keysize, ret = 1; - int rsa_outlen = 0, hexdump = 0, asn1parse = 0, need_priv = 0, rev = 0; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, rsautl_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(rsautl_options); - ret = 0; - goto end; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDE, &keyformat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_ASN1PARSE: - asn1parse = 1; - break; - case OPT_HEXDUMP: - hexdump = 1; - break; - case OPT_RAW: - pad = RSA_NO_PADDING; - break; - case OPT_OAEP: - pad = RSA_PKCS1_OAEP_PADDING; - break; - case OPT_SSL: - pad = RSA_SSLV23_PADDING; - break; - case OPT_PKCS: - pad = RSA_PKCS1_PADDING; - break; - case OPT_X931: - pad = RSA_X931_PADDING; - break; - case OPT_SIGN: - rsa_mode = RSA_SIGN; - need_priv = 1; - break; - case OPT_VERIFY: - rsa_mode = RSA_VERIFY; - break; - case OPT_REV: - rev = 1; - break; - case OPT_ENCRYPT: - rsa_mode = RSA_ENCRYPT; - break; - case OPT_DECRYPT: - rsa_mode = RSA_DECRYPT; - need_priv = 1; - break; - case OPT_PUBIN: - key_type = KEY_PUBKEY; - break; - case OPT_CERTIN: - key_type = KEY_CERT; - break; - case OPT_INKEY: - keyfile = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (need_priv && (key_type != KEY_PRIVKEY)) { - BIO_printf(bio_err, "A private key is needed for this operation\n"); - goto end; - } - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - switch (key_type) { - case KEY_PRIVKEY: - pkey = load_key(keyfile, keyformat, 0, passin, e, "Private Key"); - break; - - case KEY_PUBKEY: - pkey = load_pubkey(keyfile, keyformat, 0, NULL, e, "Public Key"); - break; - - case KEY_CERT: - x = load_cert(keyfile, keyformat, "Certificate"); - if (x) { - pkey = X509_get_pubkey(x); - X509_free(x); - } - break; - } - - if (pkey == NULL) - return 1; - - rsa = EVP_PKEY_get1_RSA(pkey); - EVP_PKEY_free(pkey); - - if (rsa == NULL) { - BIO_printf(bio_err, "Error getting RSA key\n"); - ERR_print_errors(bio_err); - goto end; - } - - in = bio_open_default(infile, 'r', FORMAT_BINARY); - if (in == NULL) - goto end; - out = bio_open_default(outfile, 'w', FORMAT_BINARY); - if (out == NULL) - goto end; - - keysize = RSA_size(rsa); - - rsa_in = app_malloc(keysize * 2, "hold rsa key"); - rsa_out = app_malloc(keysize, "output rsa key"); - - /* Read the input data */ - rsa_inlen = BIO_read(in, rsa_in, keysize * 2); - if (rsa_inlen < 0) { - BIO_printf(bio_err, "Error reading input Data\n"); - goto end; - } - if (rev) { - int i; - unsigned char ctmp; - for (i = 0; i < rsa_inlen / 2; i++) { - ctmp = rsa_in[i]; - rsa_in[i] = rsa_in[rsa_inlen - 1 - i]; - rsa_in[rsa_inlen - 1 - i] = ctmp; - } - } - switch (rsa_mode) { - - case RSA_VERIFY: - rsa_outlen = RSA_public_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); - break; - - case RSA_SIGN: - rsa_outlen = - RSA_private_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); - break; - - case RSA_ENCRYPT: - rsa_outlen = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); - break; - - case RSA_DECRYPT: - rsa_outlen = - RSA_private_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad); - break; - } - - if (rsa_outlen < 0) { - BIO_printf(bio_err, "RSA operation error\n"); - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - if (asn1parse) { - if (!ASN1_parse_dump(out, rsa_out, rsa_outlen, 1, -1)) { - ERR_print_errors(bio_err); - } - } else if (hexdump) { - BIO_dump(out, (char *)rsa_out, rsa_outlen); - } else { - BIO_write(out, rsa_out, rsa_outlen); - } - end: - RSA_free(rsa); - release_engine(e); - BIO_free(in); - BIO_free_all(out); - OPENSSL_free(rsa_in); - OPENSSL_free(rsa_out); - OPENSSL_free(passin); - return ret; -} diff --git a/contrib/libs/openssl/apps/s_apps.h b/contrib/libs/openssl/apps/s_apps.h deleted file mode 100644 index f94e659e71..0000000000 --- a/contrib/libs/openssl/apps/s_apps.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> - -#include <openssl/ssl.h> - -#define PORT "4433" -#define PROTOCOL "tcp" - -typedef int (*do_server_cb)(int s, int stype, int prot, unsigned char *context); -int do_server(int *accept_sock, const char *host, const char *port, - int family, int type, int protocol, do_server_cb cb, - unsigned char *context, int naccept, BIO *bio_s_out); - -int verify_callback(int ok, X509_STORE_CTX *ctx); - -int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file); -int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key, - STACK_OF(X509) *chain, int build_chain); -int ssl_print_sigalgs(BIO *out, SSL *s); -int ssl_print_point_formats(BIO *out, SSL *s); -int ssl_print_groups(BIO *out, SSL *s, int noshared); -int ssl_print_tmp_key(BIO *out, SSL *s); -int init_client(int *sock, const char *host, const char *port, - const char *bindhost, const char *bindport, - int family, int type, int protocol); -int should_retry(int i); - -long bio_dump_callback(BIO *bio, int cmd, const char *argp, - int argi, long argl, long ret); - -void apps_ssl_info_callback(const SSL *s, int where, int ret); -void msg_cb(int write_p, int version, int content_type, const void *buf, - size_t len, SSL *ssl, void *arg); -void tlsext_cb(SSL *s, int client_server, int type, const unsigned char *data, - int len, void *arg); - -int generate_cookie_callback(SSL *ssl, unsigned char *cookie, - unsigned int *cookie_len); -int verify_cookie_callback(SSL *ssl, const unsigned char *cookie, - unsigned int cookie_len); - -#ifdef __VMS /* 31 char symbol name limit */ -# define generate_stateless_cookie_callback generate_stateless_cookie_cb -# define verify_stateless_cookie_callback verify_stateless_cookie_cb -#endif - -int generate_stateless_cookie_callback(SSL *ssl, unsigned char *cookie, - size_t *cookie_len); -int verify_stateless_cookie_callback(SSL *ssl, const unsigned char *cookie, - size_t cookie_len); - -typedef struct ssl_excert_st SSL_EXCERT; - -void ssl_ctx_set_excert(SSL_CTX *ctx, SSL_EXCERT *exc); -void ssl_excert_free(SSL_EXCERT *exc); -int args_excert(int option, SSL_EXCERT **pexc); -int load_excert(SSL_EXCERT **pexc); -void print_verify_detail(SSL *s, BIO *bio); -void print_ssl_summary(SSL *s); -int config_ctx(SSL_CONF_CTX *cctx, STACK_OF(OPENSSL_STRING) *str, SSL_CTX *ctx); -int ssl_ctx_add_crls(SSL_CTX *ctx, STACK_OF(X509_CRL) *crls, - int crl_download); -int ssl_load_stores(SSL_CTX *ctx, const char *vfyCApath, - const char *vfyCAfile, const char *chCApath, - const char *chCAfile, STACK_OF(X509_CRL) *crls, - int crl_download); -void ssl_ctx_security_debug(SSL_CTX *ctx, int verbose); -int set_keylog_file(SSL_CTX *ctx, const char *keylog_file); -void print_ca_names(BIO *bio, SSL *s); diff --git a/contrib/libs/openssl/apps/s_cb.c b/contrib/libs/openssl/apps/s_cb.c deleted file mode 100644 index dee1b2e5b4..0000000000 --- a/contrib/libs/openssl/apps/s_cb.c +++ /dev/null @@ -1,1540 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* callback functions used by s_client, s_server, and s_time */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> /* for memcpy() and strcmp() */ -#include "apps.h" -#include <openssl/err.h> -#include <openssl/rand.h> -#include <openssl/x509.h> -#include <openssl/ssl.h> -#include <openssl/bn.h> -#ifndef OPENSSL_NO_DH -# include <openssl/dh.h> -#endif -#include "s_apps.h" - -#define COOKIE_SECRET_LENGTH 16 - -VERIFY_CB_ARGS verify_args = { -1, 0, X509_V_OK, 0 }; - -#ifndef OPENSSL_NO_SOCK -static unsigned char cookie_secret[COOKIE_SECRET_LENGTH]; -static int cookie_initialized = 0; -#endif -static BIO *bio_keylog = NULL; - -static const char *lookup(int val, const STRINT_PAIR* list, const char* def) -{ - for ( ; list->name; ++list) - if (list->retval == val) - return list->name; - return def; -} - -int verify_callback(int ok, X509_STORE_CTX *ctx) -{ - X509 *err_cert; - int err, depth; - - err_cert = X509_STORE_CTX_get_current_cert(ctx); - err = X509_STORE_CTX_get_error(ctx); - depth = X509_STORE_CTX_get_error_depth(ctx); - - if (!verify_args.quiet || !ok) { - BIO_printf(bio_err, "depth=%d ", depth); - if (err_cert != NULL) { - X509_NAME_print_ex(bio_err, - X509_get_subject_name(err_cert), - 0, get_nameopt()); - BIO_puts(bio_err, "\n"); - } else { - BIO_puts(bio_err, "<no cert>\n"); - } - } - if (!ok) { - BIO_printf(bio_err, "verify error:num=%d:%s\n", err, - X509_verify_cert_error_string(err)); - if (verify_args.depth < 0 || verify_args.depth >= depth) { - if (!verify_args.return_error) - ok = 1; - verify_args.error = err; - } else { - ok = 0; - verify_args.error = X509_V_ERR_CERT_CHAIN_TOO_LONG; - } - } - switch (err) { - case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: - BIO_puts(bio_err, "issuer= "); - X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert), - 0, get_nameopt()); - BIO_puts(bio_err, "\n"); - break; - case X509_V_ERR_CERT_NOT_YET_VALID: - case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: - BIO_printf(bio_err, "notBefore="); - ASN1_TIME_print(bio_err, X509_get0_notBefore(err_cert)); - BIO_printf(bio_err, "\n"); - break; - case X509_V_ERR_CERT_HAS_EXPIRED: - case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: - BIO_printf(bio_err, "notAfter="); - ASN1_TIME_print(bio_err, X509_get0_notAfter(err_cert)); - BIO_printf(bio_err, "\n"); - break; - case X509_V_ERR_NO_EXPLICIT_POLICY: - if (!verify_args.quiet) - policies_print(ctx); - break; - } - if (err == X509_V_OK && ok == 2 && !verify_args.quiet) - policies_print(ctx); - if (ok && !verify_args.quiet) - BIO_printf(bio_err, "verify return:%d\n", ok); - return ok; -} - -int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file) -{ - if (cert_file != NULL) { - if (SSL_CTX_use_certificate_file(ctx, cert_file, - SSL_FILETYPE_PEM) <= 0) { - BIO_printf(bio_err, "unable to get certificate from '%s'\n", - cert_file); - ERR_print_errors(bio_err); - return 0; - } - if (key_file == NULL) - key_file = cert_file; - if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0) { - BIO_printf(bio_err, "unable to get private key from '%s'\n", - key_file); - ERR_print_errors(bio_err); - return 0; - } - - /* - * If we are using DSA, we can copy the parameters from the private - * key - */ - - /* - * Now we know that a key and cert have been set against the SSL - * context - */ - if (!SSL_CTX_check_private_key(ctx)) { - BIO_printf(bio_err, - "Private key does not match the certificate public key\n"); - return 0; - } - } - return 1; -} - -int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key, - STACK_OF(X509) *chain, int build_chain) -{ - int chflags = chain ? SSL_BUILD_CHAIN_FLAG_CHECK : 0; - if (cert == NULL) - return 1; - if (SSL_CTX_use_certificate(ctx, cert) <= 0) { - BIO_printf(bio_err, "error setting certificate\n"); - ERR_print_errors(bio_err); - return 0; - } - - if (SSL_CTX_use_PrivateKey(ctx, key) <= 0) { - BIO_printf(bio_err, "error setting private key\n"); - ERR_print_errors(bio_err); - return 0; - } - - /* - * Now we know that a key and cert have been set against the SSL context - */ - if (!SSL_CTX_check_private_key(ctx)) { - BIO_printf(bio_err, - "Private key does not match the certificate public key\n"); - return 0; - } - if (chain && !SSL_CTX_set1_chain(ctx, chain)) { - BIO_printf(bio_err, "error setting certificate chain\n"); - ERR_print_errors(bio_err); - return 0; - } - if (build_chain && !SSL_CTX_build_cert_chain(ctx, chflags)) { - BIO_printf(bio_err, "error building certificate chain\n"); - ERR_print_errors(bio_err); - return 0; - } - return 1; -} - -static STRINT_PAIR cert_type_list[] = { - {"RSA sign", TLS_CT_RSA_SIGN}, - {"DSA sign", TLS_CT_DSS_SIGN}, - {"RSA fixed DH", TLS_CT_RSA_FIXED_DH}, - {"DSS fixed DH", TLS_CT_DSS_FIXED_DH}, - {"ECDSA sign", TLS_CT_ECDSA_SIGN}, - {"RSA fixed ECDH", TLS_CT_RSA_FIXED_ECDH}, - {"ECDSA fixed ECDH", TLS_CT_ECDSA_FIXED_ECDH}, - {"GOST01 Sign", TLS_CT_GOST01_SIGN}, - {"GOST12 Sign", TLS_CT_GOST12_SIGN}, - {NULL} -}; - -static void ssl_print_client_cert_types(BIO *bio, SSL *s) -{ - const unsigned char *p; - int i; - int cert_type_num = SSL_get0_certificate_types(s, &p); - if (!cert_type_num) - return; - BIO_puts(bio, "Client Certificate Types: "); - for (i = 0; i < cert_type_num; i++) { - unsigned char cert_type = p[i]; - const char *cname = lookup((int)cert_type, cert_type_list, NULL); - - if (i) - BIO_puts(bio, ", "); - if (cname != NULL) - BIO_puts(bio, cname); - else - BIO_printf(bio, "UNKNOWN (%d),", cert_type); - } - BIO_puts(bio, "\n"); -} - -static const char *get_sigtype(int nid) -{ - switch (nid) { - case EVP_PKEY_RSA: - return "RSA"; - - case EVP_PKEY_RSA_PSS: - return "RSA-PSS"; - - case EVP_PKEY_DSA: - return "DSA"; - - case EVP_PKEY_EC: - return "ECDSA"; - - case NID_ED25519: - return "Ed25519"; - - case NID_ED448: - return "Ed448"; - - case NID_id_GostR3410_2001: - return "gost2001"; - - case NID_id_GostR3410_2012_256: - return "gost2012_256"; - - case NID_id_GostR3410_2012_512: - return "gost2012_512"; - - default: - return NULL; - } -} - -static int do_print_sigalgs(BIO *out, SSL *s, int shared) -{ - int i, nsig, client; - client = SSL_is_server(s) ? 0 : 1; - if (shared) - nsig = SSL_get_shared_sigalgs(s, 0, NULL, NULL, NULL, NULL, NULL); - else - nsig = SSL_get_sigalgs(s, -1, NULL, NULL, NULL, NULL, NULL); - if (nsig == 0) - return 1; - - if (shared) - BIO_puts(out, "Shared "); - - if (client) - BIO_puts(out, "Requested "); - BIO_puts(out, "Signature Algorithms: "); - for (i = 0; i < nsig; i++) { - int hash_nid, sign_nid; - unsigned char rhash, rsign; - const char *sstr = NULL; - if (shared) - SSL_get_shared_sigalgs(s, i, &sign_nid, &hash_nid, NULL, - &rsign, &rhash); - else - SSL_get_sigalgs(s, i, &sign_nid, &hash_nid, NULL, &rsign, &rhash); - if (i) - BIO_puts(out, ":"); - sstr = get_sigtype(sign_nid); - if (sstr) - BIO_printf(out, "%s", sstr); - else - BIO_printf(out, "0x%02X", (int)rsign); - if (hash_nid != NID_undef) - BIO_printf(out, "+%s", OBJ_nid2sn(hash_nid)); - else if (sstr == NULL) - BIO_printf(out, "+0x%02X", (int)rhash); - } - BIO_puts(out, "\n"); - return 1; -} - -int ssl_print_sigalgs(BIO *out, SSL *s) -{ - int nid; - if (!SSL_is_server(s)) - ssl_print_client_cert_types(out, s); - do_print_sigalgs(out, s, 0); - do_print_sigalgs(out, s, 1); - if (SSL_get_peer_signature_nid(s, &nid) && nid != NID_undef) - BIO_printf(out, "Peer signing digest: %s\n", OBJ_nid2sn(nid)); - if (SSL_get_peer_signature_type_nid(s, &nid)) - BIO_printf(out, "Peer signature type: %s\n", get_sigtype(nid)); - return 1; -} - -#ifndef OPENSSL_NO_EC -int ssl_print_point_formats(BIO *out, SSL *s) -{ - int i, nformats; - const char *pformats; - nformats = SSL_get0_ec_point_formats(s, &pformats); - if (nformats <= 0) - return 1; - BIO_puts(out, "Supported Elliptic Curve Point Formats: "); - for (i = 0; i < nformats; i++, pformats++) { - if (i) - BIO_puts(out, ":"); - switch (*pformats) { - case TLSEXT_ECPOINTFORMAT_uncompressed: - BIO_puts(out, "uncompressed"); - break; - - case TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime: - BIO_puts(out, "ansiX962_compressed_prime"); - break; - - case TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2: - BIO_puts(out, "ansiX962_compressed_char2"); - break; - - default: - BIO_printf(out, "unknown(%d)", (int)*pformats); - break; - - } - } - BIO_puts(out, "\n"); - return 1; -} - -int ssl_print_groups(BIO *out, SSL *s, int noshared) -{ - int i, ngroups, *groups, nid; - const char *gname; - - ngroups = SSL_get1_groups(s, NULL); - if (ngroups <= 0) - return 1; - groups = app_malloc(ngroups * sizeof(int), "groups to print"); - SSL_get1_groups(s, groups); - - BIO_puts(out, "Supported Elliptic Groups: "); - for (i = 0; i < ngroups; i++) { - if (i) - BIO_puts(out, ":"); - nid = groups[i]; - /* If unrecognised print out hex version */ - if (nid & TLSEXT_nid_unknown) { - BIO_printf(out, "0x%04X", nid & 0xFFFF); - } else { - /* TODO(TLS1.3): Get group name here */ - /* Use NIST name for curve if it exists */ - gname = EC_curve_nid2nist(nid); - if (gname == NULL) - gname = OBJ_nid2sn(nid); - BIO_printf(out, "%s", gname); - } - } - OPENSSL_free(groups); - if (noshared) { - BIO_puts(out, "\n"); - return 1; - } - BIO_puts(out, "\nShared Elliptic groups: "); - ngroups = SSL_get_shared_group(s, -1); - for (i = 0; i < ngroups; i++) { - if (i) - BIO_puts(out, ":"); - nid = SSL_get_shared_group(s, i); - /* TODO(TLS1.3): Convert for DH groups */ - gname = EC_curve_nid2nist(nid); - if (gname == NULL) - gname = OBJ_nid2sn(nid); - BIO_printf(out, "%s", gname); - } - if (ngroups == 0) - BIO_puts(out, "NONE"); - BIO_puts(out, "\n"); - return 1; -} -#endif - -int ssl_print_tmp_key(BIO *out, SSL *s) -{ - EVP_PKEY *key; - - if (!SSL_get_peer_tmp_key(s, &key)) - return 1; - BIO_puts(out, "Server Temp Key: "); - switch (EVP_PKEY_id(key)) { - case EVP_PKEY_RSA: - BIO_printf(out, "RSA, %d bits\n", EVP_PKEY_bits(key)); - break; - - case EVP_PKEY_DH: - BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(key)); - break; -#ifndef OPENSSL_NO_EC - case EVP_PKEY_EC: - { - EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key); - int nid; - const char *cname; - nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec)); - EC_KEY_free(ec); - cname = EC_curve_nid2nist(nid); - if (cname == NULL) - cname = OBJ_nid2sn(nid); - BIO_printf(out, "ECDH, %s, %d bits\n", cname, EVP_PKEY_bits(key)); - } - break; -#endif - default: - BIO_printf(out, "%s, %d bits\n", OBJ_nid2sn(EVP_PKEY_id(key)), - EVP_PKEY_bits(key)); - } - EVP_PKEY_free(key); - return 1; -} - -long bio_dump_callback(BIO *bio, int cmd, const char *argp, - int argi, long argl, long ret) -{ - BIO *out; - - out = (BIO *)BIO_get_callback_arg(bio); - if (out == NULL) - return ret; - - if (cmd == (BIO_CB_READ | BIO_CB_RETURN)) { - BIO_printf(out, "read from %p [%p] (%lu bytes => %ld (0x%lX))\n", - (void *)bio, (void *)argp, (unsigned long)argi, ret, ret); - BIO_dump(out, argp, (int)ret); - return ret; - } else if (cmd == (BIO_CB_WRITE | BIO_CB_RETURN)) { - BIO_printf(out, "write to %p [%p] (%lu bytes => %ld (0x%lX))\n", - (void *)bio, (void *)argp, (unsigned long)argi, ret, ret); - BIO_dump(out, argp, (int)ret); - } - return ret; -} - -void apps_ssl_info_callback(const SSL *s, int where, int ret) -{ - const char *str; - int w; - - w = where & ~SSL_ST_MASK; - - if (w & SSL_ST_CONNECT) - str = "SSL_connect"; - else if (w & SSL_ST_ACCEPT) - str = "SSL_accept"; - else - str = "undefined"; - - if (where & SSL_CB_LOOP) { - BIO_printf(bio_err, "%s:%s\n", str, SSL_state_string_long(s)); - } else if (where & SSL_CB_ALERT) { - str = (where & SSL_CB_READ) ? "read" : "write"; - BIO_printf(bio_err, "SSL3 alert %s:%s:%s\n", - str, - SSL_alert_type_string_long(ret), - SSL_alert_desc_string_long(ret)); - } else if (where & SSL_CB_EXIT) { - if (ret == 0) - BIO_printf(bio_err, "%s:failed in %s\n", - str, SSL_state_string_long(s)); - else if (ret < 0) - BIO_printf(bio_err, "%s:error in %s\n", - str, SSL_state_string_long(s)); - } -} - -static STRINT_PAIR ssl_versions[] = { - {"SSL 3.0", SSL3_VERSION}, - {"TLS 1.0", TLS1_VERSION}, - {"TLS 1.1", TLS1_1_VERSION}, - {"TLS 1.2", TLS1_2_VERSION}, - {"TLS 1.3", TLS1_3_VERSION}, - {"DTLS 1.0", DTLS1_VERSION}, - {"DTLS 1.0 (bad)", DTLS1_BAD_VER}, - {NULL} -}; - -static STRINT_PAIR alert_types[] = { - {" close_notify", 0}, - {" end_of_early_data", 1}, - {" unexpected_message", 10}, - {" bad_record_mac", 20}, - {" decryption_failed", 21}, - {" record_overflow", 22}, - {" decompression_failure", 30}, - {" handshake_failure", 40}, - {" bad_certificate", 42}, - {" unsupported_certificate", 43}, - {" certificate_revoked", 44}, - {" certificate_expired", 45}, - {" certificate_unknown", 46}, - {" illegal_parameter", 47}, - {" unknown_ca", 48}, - {" access_denied", 49}, - {" decode_error", 50}, - {" decrypt_error", 51}, - {" export_restriction", 60}, - {" protocol_version", 70}, - {" insufficient_security", 71}, - {" internal_error", 80}, - {" inappropriate_fallback", 86}, - {" user_canceled", 90}, - {" no_renegotiation", 100}, - {" missing_extension", 109}, - {" unsupported_extension", 110}, - {" certificate_unobtainable", 111}, - {" unrecognized_name", 112}, - {" bad_certificate_status_response", 113}, - {" bad_certificate_hash_value", 114}, - {" unknown_psk_identity", 115}, - {" certificate_required", 116}, - {NULL} -}; - -static STRINT_PAIR handshakes[] = { - {", HelloRequest", SSL3_MT_HELLO_REQUEST}, - {", ClientHello", SSL3_MT_CLIENT_HELLO}, - {", ServerHello", SSL3_MT_SERVER_HELLO}, - {", HelloVerifyRequest", DTLS1_MT_HELLO_VERIFY_REQUEST}, - {", NewSessionTicket", SSL3_MT_NEWSESSION_TICKET}, - {", EndOfEarlyData", SSL3_MT_END_OF_EARLY_DATA}, - {", EncryptedExtensions", SSL3_MT_ENCRYPTED_EXTENSIONS}, - {", Certificate", SSL3_MT_CERTIFICATE}, - {", ServerKeyExchange", SSL3_MT_SERVER_KEY_EXCHANGE}, - {", CertificateRequest", SSL3_MT_CERTIFICATE_REQUEST}, - {", ServerHelloDone", SSL3_MT_SERVER_DONE}, - {", CertificateVerify", SSL3_MT_CERTIFICATE_VERIFY}, - {", ClientKeyExchange", SSL3_MT_CLIENT_KEY_EXCHANGE}, - {", Finished", SSL3_MT_FINISHED}, - {", CertificateUrl", SSL3_MT_CERTIFICATE_URL}, - {", CertificateStatus", SSL3_MT_CERTIFICATE_STATUS}, - {", SupplementalData", SSL3_MT_SUPPLEMENTAL_DATA}, - {", KeyUpdate", SSL3_MT_KEY_UPDATE}, -#ifndef OPENSSL_NO_NEXTPROTONEG - {", NextProto", SSL3_MT_NEXT_PROTO}, -#endif - {", MessageHash", SSL3_MT_MESSAGE_HASH}, - {NULL} -}; - -void msg_cb(int write_p, int version, int content_type, const void *buf, - size_t len, SSL *ssl, void *arg) -{ - BIO *bio = arg; - const char *str_write_p = write_p ? ">>>" : "<<<"; - const char *str_version = lookup(version, ssl_versions, "???"); - const char *str_content_type = "", *str_details1 = "", *str_details2 = ""; - const unsigned char* bp = buf; - - if (version == SSL3_VERSION || - version == TLS1_VERSION || - version == TLS1_1_VERSION || - version == TLS1_2_VERSION || - version == TLS1_3_VERSION || - version == DTLS1_VERSION || version == DTLS1_BAD_VER) { - switch (content_type) { - case 20: - str_content_type = ", ChangeCipherSpec"; - break; - case 21: - str_content_type = ", Alert"; - str_details1 = ", ???"; - if (len == 2) { - switch (bp[0]) { - case 1: - str_details1 = ", warning"; - break; - case 2: - str_details1 = ", fatal"; - break; - } - str_details2 = lookup((int)bp[1], alert_types, " ???"); - } - break; - case 22: - str_content_type = ", Handshake"; - str_details1 = "???"; - if (len > 0) - str_details1 = lookup((int)bp[0], handshakes, "???"); - break; - case 23: - str_content_type = ", ApplicationData"; - break; -#ifndef OPENSSL_NO_HEARTBEATS - case 24: - str_details1 = ", Heartbeat"; - - if (len > 0) { - switch (bp[0]) { - case 1: - str_details1 = ", HeartbeatRequest"; - break; - case 2: - str_details1 = ", HeartbeatResponse"; - break; - } - } - break; -#endif - } - } - - BIO_printf(bio, "%s %s%s [length %04lx]%s%s\n", str_write_p, str_version, - str_content_type, (unsigned long)len, str_details1, - str_details2); - - if (len > 0) { - size_t num, i; - - BIO_printf(bio, " "); - num = len; - for (i = 0; i < num; i++) { - if (i % 16 == 0 && i > 0) - BIO_printf(bio, "\n "); - BIO_printf(bio, " %02x", ((const unsigned char *)buf)[i]); - } - if (i < len) - BIO_printf(bio, " ..."); - BIO_printf(bio, "\n"); - } - (void)BIO_flush(bio); -} - -static STRINT_PAIR tlsext_types[] = { - {"server name", TLSEXT_TYPE_server_name}, - {"max fragment length", TLSEXT_TYPE_max_fragment_length}, - {"client certificate URL", TLSEXT_TYPE_client_certificate_url}, - {"trusted CA keys", TLSEXT_TYPE_trusted_ca_keys}, - {"truncated HMAC", TLSEXT_TYPE_truncated_hmac}, - {"status request", TLSEXT_TYPE_status_request}, - {"user mapping", TLSEXT_TYPE_user_mapping}, - {"client authz", TLSEXT_TYPE_client_authz}, - {"server authz", TLSEXT_TYPE_server_authz}, - {"cert type", TLSEXT_TYPE_cert_type}, - {"supported_groups", TLSEXT_TYPE_supported_groups}, - {"EC point formats", TLSEXT_TYPE_ec_point_formats}, - {"SRP", TLSEXT_TYPE_srp}, - {"signature algorithms", TLSEXT_TYPE_signature_algorithms}, - {"use SRTP", TLSEXT_TYPE_use_srtp}, - {"heartbeat", TLSEXT_TYPE_heartbeat}, - {"session ticket", TLSEXT_TYPE_session_ticket}, - {"renegotiation info", TLSEXT_TYPE_renegotiate}, - {"signed certificate timestamps", TLSEXT_TYPE_signed_certificate_timestamp}, - {"TLS padding", TLSEXT_TYPE_padding}, -#ifdef TLSEXT_TYPE_next_proto_neg - {"next protocol", TLSEXT_TYPE_next_proto_neg}, -#endif -#ifdef TLSEXT_TYPE_encrypt_then_mac - {"encrypt-then-mac", TLSEXT_TYPE_encrypt_then_mac}, -#endif -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - {"application layer protocol negotiation", - TLSEXT_TYPE_application_layer_protocol_negotiation}, -#endif -#ifdef TLSEXT_TYPE_extended_master_secret - {"extended master secret", TLSEXT_TYPE_extended_master_secret}, -#endif - {"key share", TLSEXT_TYPE_key_share}, - {"supported versions", TLSEXT_TYPE_supported_versions}, - {"psk", TLSEXT_TYPE_psk}, - {"psk kex modes", TLSEXT_TYPE_psk_kex_modes}, - {"certificate authorities", TLSEXT_TYPE_certificate_authorities}, - {"post handshake auth", TLSEXT_TYPE_post_handshake_auth}, - {NULL} -}; - -/* from rfc8446 4.2.3. + gost (https://tools.ietf.org/id/draft-smyshlyaev-tls12-gost-suites-04.html) */ -static STRINT_PAIR signature_tls13_scheme_list[] = { - {"rsa_pkcs1_sha1", 0x0201 /* TLSEXT_SIGALG_rsa_pkcs1_sha1 */}, - {"ecdsa_sha1", 0x0203 /* TLSEXT_SIGALG_ecdsa_sha1 */}, -/* {"rsa_pkcs1_sha224", 0x0301 TLSEXT_SIGALG_rsa_pkcs1_sha224}, not in rfc8446 */ -/* {"ecdsa_sha224", 0x0303 TLSEXT_SIGALG_ecdsa_sha224} not in rfc8446 */ - {"rsa_pkcs1_sha256", 0x0401 /* TLSEXT_SIGALG_rsa_pkcs1_sha256 */}, - {"ecdsa_secp256r1_sha256", 0x0403 /* TLSEXT_SIGALG_ecdsa_secp256r1_sha256 */}, - {"rsa_pkcs1_sha384", 0x0501 /* TLSEXT_SIGALG_rsa_pkcs1_sha384 */}, - {"ecdsa_secp384r1_sha384", 0x0503 /* TLSEXT_SIGALG_ecdsa_secp384r1_sha384 */}, - {"rsa_pkcs1_sha512", 0x0601 /* TLSEXT_SIGALG_rsa_pkcs1_sha512 */}, - {"ecdsa_secp521r1_sha512", 0x0603 /* TLSEXT_SIGALG_ecdsa_secp521r1_sha512 */}, - {"rsa_pss_rsae_sha256", 0x0804 /* TLSEXT_SIGALG_rsa_pss_rsae_sha256 */}, - {"rsa_pss_rsae_sha384", 0x0805 /* TLSEXT_SIGALG_rsa_pss_rsae_sha384 */}, - {"rsa_pss_rsae_sha512", 0x0806 /* TLSEXT_SIGALG_rsa_pss_rsae_sha512 */}, - {"ed25519", 0x0807 /* TLSEXT_SIGALG_ed25519 */}, - {"ed448", 0x0808 /* TLSEXT_SIGALG_ed448 */}, - {"rsa_pss_pss_sha256", 0x0809 /* TLSEXT_SIGALG_rsa_pss_pss_sha256 */}, - {"rsa_pss_pss_sha384", 0x080a /* TLSEXT_SIGALG_rsa_pss_pss_sha384 */}, - {"rsa_pss_pss_sha512", 0x080b /* TLSEXT_SIGALG_rsa_pss_pss_sha512 */}, - {"gostr34102001", 0xeded /* TLSEXT_SIGALG_gostr34102001_gostr3411 */}, - {"gostr34102012_256", 0xeeee /* TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256 */}, - {"gostr34102012_512", 0xefef /* TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512 */}, - {NULL} -}; - -/* from rfc5246 7.4.1.4.1. */ -static STRINT_PAIR signature_tls12_alg_list[] = { - {"anonymous", TLSEXT_signature_anonymous /* 0 */}, - {"RSA", TLSEXT_signature_rsa /* 1 */}, - {"DSA", TLSEXT_signature_dsa /* 2 */}, - {"ECDSA", TLSEXT_signature_ecdsa /* 3 */}, - {NULL} -}; - -/* from rfc5246 7.4.1.4.1. */ -static STRINT_PAIR signature_tls12_hash_list[] = { - {"none", TLSEXT_hash_none /* 0 */}, - {"MD5", TLSEXT_hash_md5 /* 1 */}, - {"SHA1", TLSEXT_hash_sha1 /* 2 */}, - {"SHA224", TLSEXT_hash_sha224 /* 3 */}, - {"SHA256", TLSEXT_hash_sha256 /* 4 */}, - {"SHA384", TLSEXT_hash_sha384 /* 5 */}, - {"SHA512", TLSEXT_hash_sha512 /* 6 */}, - {NULL} -}; - -void tlsext_cb(SSL *s, int client_server, int type, - const unsigned char *data, int len, void *arg) -{ - BIO *bio = arg; - const char *extname = lookup(type, tlsext_types, "unknown"); - - BIO_printf(bio, "TLS %s extension \"%s\" (id=%d), len=%d\n", - client_server ? "server" : "client", extname, type, len); - BIO_dump(bio, (const char *)data, len); - (void)BIO_flush(bio); -} - -#ifndef OPENSSL_NO_SOCK -int generate_cookie_callback(SSL *ssl, unsigned char *cookie, - unsigned int *cookie_len) -{ - unsigned char *buffer; - size_t length = 0; - unsigned short port; - BIO_ADDR *lpeer = NULL, *peer = NULL; - - /* Initialize a random secret */ - if (!cookie_initialized) { - if (RAND_bytes(cookie_secret, COOKIE_SECRET_LENGTH) <= 0) { - BIO_printf(bio_err, "error setting random cookie secret\n"); - return 0; - } - cookie_initialized = 1; - } - - if (SSL_is_dtls(ssl)) { - lpeer = peer = BIO_ADDR_new(); - if (peer == NULL) { - BIO_printf(bio_err, "memory full\n"); - return 0; - } - - /* Read peer information */ - (void)BIO_dgram_get_peer(SSL_get_rbio(ssl), peer); - } else { - peer = ourpeer; - } - - /* Create buffer with peer's address and port */ - if (!BIO_ADDR_rawaddress(peer, NULL, &length)) { - BIO_printf(bio_err, "Failed getting peer address\n"); - return 0; - } - OPENSSL_assert(length != 0); - port = BIO_ADDR_rawport(peer); - length += sizeof(port); - buffer = app_malloc(length, "cookie generate buffer"); - - memcpy(buffer, &port, sizeof(port)); - BIO_ADDR_rawaddress(peer, buffer + sizeof(port), NULL); - - /* Calculate HMAC of buffer using the secret */ - HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH, - buffer, length, cookie, cookie_len); - - OPENSSL_free(buffer); - BIO_ADDR_free(lpeer); - - return 1; -} - -int verify_cookie_callback(SSL *ssl, const unsigned char *cookie, - unsigned int cookie_len) -{ - unsigned char result[EVP_MAX_MD_SIZE]; - unsigned int resultlength; - - /* Note: we check cookie_initialized because if it's not, - * it cannot be valid */ - if (cookie_initialized - && generate_cookie_callback(ssl, result, &resultlength) - && cookie_len == resultlength - && memcmp(result, cookie, resultlength) == 0) - return 1; - - return 0; -} - -int generate_stateless_cookie_callback(SSL *ssl, unsigned char *cookie, - size_t *cookie_len) -{ - unsigned int temp; - int res = generate_cookie_callback(ssl, cookie, &temp); - *cookie_len = temp; - return res; -} - -int verify_stateless_cookie_callback(SSL *ssl, const unsigned char *cookie, - size_t cookie_len) -{ - return verify_cookie_callback(ssl, cookie, cookie_len); -} - -#endif - -/* - * Example of extended certificate handling. Where the standard support of - * one certificate per algorithm is not sufficient an application can decide - * which certificate(s) to use at runtime based on whatever criteria it deems - * appropriate. - */ - -/* Linked list of certificates, keys and chains */ -struct ssl_excert_st { - int certform; - const char *certfile; - int keyform; - const char *keyfile; - const char *chainfile; - X509 *cert; - EVP_PKEY *key; - STACK_OF(X509) *chain; - int build_chain; - struct ssl_excert_st *next, *prev; -}; - -static STRINT_PAIR chain_flags[] = { - {"Overall Validity", CERT_PKEY_VALID}, - {"Sign with EE key", CERT_PKEY_SIGN}, - {"EE signature", CERT_PKEY_EE_SIGNATURE}, - {"CA signature", CERT_PKEY_CA_SIGNATURE}, - {"EE key parameters", CERT_PKEY_EE_PARAM}, - {"CA key parameters", CERT_PKEY_CA_PARAM}, - {"Explicitly sign with EE key", CERT_PKEY_EXPLICIT_SIGN}, - {"Issuer Name", CERT_PKEY_ISSUER_NAME}, - {"Certificate Type", CERT_PKEY_CERT_TYPE}, - {NULL} -}; - -static void print_chain_flags(SSL *s, int flags) -{ - STRINT_PAIR *pp; - - for (pp = chain_flags; pp->name; ++pp) - BIO_printf(bio_err, "\t%s: %s\n", - pp->name, - (flags & pp->retval) ? "OK" : "NOT OK"); - BIO_printf(bio_err, "\tSuite B: "); - if (SSL_set_cert_flags(s, 0) & SSL_CERT_FLAG_SUITEB_128_LOS) - BIO_puts(bio_err, flags & CERT_PKEY_SUITEB ? "OK\n" : "NOT OK\n"); - else - BIO_printf(bio_err, "not tested\n"); -} - -/* - * Very basic selection callback: just use any certificate chain reported as - * valid. More sophisticated could prioritise according to local policy. - */ -static int set_cert_cb(SSL *ssl, void *arg) -{ - int i, rv; - SSL_EXCERT *exc = arg; -#ifdef CERT_CB_TEST_RETRY - static int retry_cnt; - if (retry_cnt < 5) { - retry_cnt++; - BIO_printf(bio_err, - "Certificate callback retry test: count %d\n", - retry_cnt); - return -1; - } -#endif - SSL_certs_clear(ssl); - - if (exc == NULL) - return 1; - - /* - * Go to end of list and traverse backwards since we prepend newer - * entries this retains the original order. - */ - while (exc->next != NULL) - exc = exc->next; - - i = 0; - - while (exc != NULL) { - i++; - rv = SSL_check_chain(ssl, exc->cert, exc->key, exc->chain); - BIO_printf(bio_err, "Checking cert chain %d:\nSubject: ", i); - X509_NAME_print_ex(bio_err, X509_get_subject_name(exc->cert), 0, - get_nameopt()); - BIO_puts(bio_err, "\n"); - print_chain_flags(ssl, rv); - if (rv & CERT_PKEY_VALID) { - if (!SSL_use_certificate(ssl, exc->cert) - || !SSL_use_PrivateKey(ssl, exc->key)) { - return 0; - } - /* - * NB: we wouldn't normally do this as it is not efficient - * building chains on each connection better to cache the chain - * in advance. - */ - if (exc->build_chain) { - if (!SSL_build_cert_chain(ssl, 0)) - return 0; - } else if (exc->chain != NULL) { - if (!SSL_set1_chain(ssl, exc->chain)) - return 0; - } - } - exc = exc->prev; - } - return 1; -} - -void ssl_ctx_set_excert(SSL_CTX *ctx, SSL_EXCERT *exc) -{ - SSL_CTX_set_cert_cb(ctx, set_cert_cb, exc); -} - -static int ssl_excert_prepend(SSL_EXCERT **pexc) -{ - SSL_EXCERT *exc = app_malloc(sizeof(*exc), "prepend cert"); - - memset(exc, 0, sizeof(*exc)); - - exc->next = *pexc; - *pexc = exc; - - if (exc->next) { - exc->certform = exc->next->certform; - exc->keyform = exc->next->keyform; - exc->next->prev = exc; - } else { - exc->certform = FORMAT_PEM; - exc->keyform = FORMAT_PEM; - } - return 1; - -} - -void ssl_excert_free(SSL_EXCERT *exc) -{ - SSL_EXCERT *curr; - - if (exc == NULL) - return; - while (exc) { - X509_free(exc->cert); - EVP_PKEY_free(exc->key); - sk_X509_pop_free(exc->chain, X509_free); - curr = exc; - exc = exc->next; - OPENSSL_free(curr); - } -} - -int load_excert(SSL_EXCERT **pexc) -{ - SSL_EXCERT *exc = *pexc; - if (exc == NULL) - return 1; - /* If nothing in list, free and set to NULL */ - if (exc->certfile == NULL && exc->next == NULL) { - ssl_excert_free(exc); - *pexc = NULL; - return 1; - } - for (; exc; exc = exc->next) { - if (exc->certfile == NULL) { - BIO_printf(bio_err, "Missing filename\n"); - return 0; - } - exc->cert = load_cert(exc->certfile, exc->certform, - "Server Certificate"); - if (exc->cert == NULL) - return 0; - if (exc->keyfile != NULL) { - exc->key = load_key(exc->keyfile, exc->keyform, - 0, NULL, NULL, "Server Key"); - } else { - exc->key = load_key(exc->certfile, exc->certform, - 0, NULL, NULL, "Server Key"); - } - if (exc->key == NULL) - return 0; - if (exc->chainfile != NULL) { - if (!load_certs(exc->chainfile, &exc->chain, FORMAT_PEM, NULL, - "Server Chain")) - return 0; - } - } - return 1; -} - -enum range { OPT_X_ENUM }; - -int args_excert(int opt, SSL_EXCERT **pexc) -{ - SSL_EXCERT *exc = *pexc; - - assert(opt > OPT_X__FIRST); - assert(opt < OPT_X__LAST); - - if (exc == NULL) { - if (!ssl_excert_prepend(&exc)) { - BIO_printf(bio_err, " %s: Error initialising xcert\n", - opt_getprog()); - goto err; - } - *pexc = exc; - } - - switch ((enum range)opt) { - case OPT_X__FIRST: - case OPT_X__LAST: - return 0; - case OPT_X_CERT: - if (exc->certfile != NULL && !ssl_excert_prepend(&exc)) { - BIO_printf(bio_err, "%s: Error adding xcert\n", opt_getprog()); - goto err; - } - *pexc = exc; - exc->certfile = opt_arg(); - break; - case OPT_X_KEY: - if (exc->keyfile != NULL) { - BIO_printf(bio_err, "%s: Key already specified\n", opt_getprog()); - goto err; - } - exc->keyfile = opt_arg(); - break; - case OPT_X_CHAIN: - if (exc->chainfile != NULL) { - BIO_printf(bio_err, "%s: Chain already specified\n", - opt_getprog()); - goto err; - } - exc->chainfile = opt_arg(); - break; - case OPT_X_CHAIN_BUILD: - exc->build_chain = 1; - break; - case OPT_X_CERTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &exc->certform)) - return 0; - break; - case OPT_X_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &exc->keyform)) - return 0; - break; - } - return 1; - - err: - ERR_print_errors(bio_err); - ssl_excert_free(exc); - *pexc = NULL; - return 0; -} - -static void print_raw_cipherlist(SSL *s) -{ - const unsigned char *rlist; - static const unsigned char scsv_id[] = { 0, 0xFF }; - size_t i, rlistlen, num; - if (!SSL_is_server(s)) - return; - num = SSL_get0_raw_cipherlist(s, NULL); - OPENSSL_assert(num == 2); - rlistlen = SSL_get0_raw_cipherlist(s, &rlist); - BIO_puts(bio_err, "Client cipher list: "); - for (i = 0; i < rlistlen; i += num, rlist += num) { - const SSL_CIPHER *c = SSL_CIPHER_find(s, rlist); - if (i) - BIO_puts(bio_err, ":"); - if (c != NULL) { - BIO_puts(bio_err, SSL_CIPHER_get_name(c)); - } else if (memcmp(rlist, scsv_id, num) == 0) { - BIO_puts(bio_err, "SCSV"); - } else { - size_t j; - BIO_puts(bio_err, "0x"); - for (j = 0; j < num; j++) - BIO_printf(bio_err, "%02X", rlist[j]); - } - } - BIO_puts(bio_err, "\n"); -} - -/* - * Hex encoder for TLSA RRdata, not ':' delimited. - */ -static char *hexencode(const unsigned char *data, size_t len) -{ - static const char *hex = "0123456789abcdef"; - char *out; - char *cp; - size_t outlen = 2 * len + 1; - int ilen = (int) outlen; - - if (outlen < len || ilen < 0 || outlen != (size_t)ilen) { - BIO_printf(bio_err, "%s: %zu-byte buffer too large to hexencode\n", - opt_getprog(), len); - exit(1); - } - cp = out = app_malloc(ilen, "TLSA hex data buffer"); - - while (len-- > 0) { - *cp++ = hex[(*data >> 4) & 0x0f]; - *cp++ = hex[*data++ & 0x0f]; - } - *cp = '\0'; - return out; -} - -void print_verify_detail(SSL *s, BIO *bio) -{ - int mdpth; - EVP_PKEY *mspki; - long verify_err = SSL_get_verify_result(s); - - if (verify_err == X509_V_OK) { - const char *peername = SSL_get0_peername(s); - - BIO_printf(bio, "Verification: OK\n"); - if (peername != NULL) - BIO_printf(bio, "Verified peername: %s\n", peername); - } else { - const char *reason = X509_verify_cert_error_string(verify_err); - - BIO_printf(bio, "Verification error: %s\n", reason); - } - - if ((mdpth = SSL_get0_dane_authority(s, NULL, &mspki)) >= 0) { - uint8_t usage, selector, mtype; - const unsigned char *data = NULL; - size_t dlen = 0; - char *hexdata; - - mdpth = SSL_get0_dane_tlsa(s, &usage, &selector, &mtype, &data, &dlen); - - /* - * The TLSA data field can be quite long when it is a certificate, - * public key or even a SHA2-512 digest. Because the initial octets of - * ASN.1 certificates and public keys contain mostly boilerplate OIDs - * and lengths, we show the last 12 bytes of the data instead, as these - * are more likely to distinguish distinct TLSA records. - */ -#define TLSA_TAIL_SIZE 12 - if (dlen > TLSA_TAIL_SIZE) - hexdata = hexencode(data + dlen - TLSA_TAIL_SIZE, TLSA_TAIL_SIZE); - else - hexdata = hexencode(data, dlen); - BIO_printf(bio, "DANE TLSA %d %d %d %s%s %s at depth %d\n", - usage, selector, mtype, - (dlen > TLSA_TAIL_SIZE) ? "..." : "", hexdata, - (mspki != NULL) ? "signed the certificate" : - mdpth ? "matched TA certificate" : "matched EE certificate", - mdpth); - OPENSSL_free(hexdata); - } -} - -void print_ssl_summary(SSL *s) -{ - const SSL_CIPHER *c; - X509 *peer; - - BIO_printf(bio_err, "Protocol version: %s\n", SSL_get_version(s)); - print_raw_cipherlist(s); - c = SSL_get_current_cipher(s); - BIO_printf(bio_err, "Ciphersuite: %s\n", SSL_CIPHER_get_name(c)); - do_print_sigalgs(bio_err, s, 0); - peer = SSL_get_peer_certificate(s); - if (peer != NULL) { - int nid; - - BIO_puts(bio_err, "Peer certificate: "); - X509_NAME_print_ex(bio_err, X509_get_subject_name(peer), - 0, get_nameopt()); - BIO_puts(bio_err, "\n"); - if (SSL_get_peer_signature_nid(s, &nid)) - BIO_printf(bio_err, "Hash used: %s\n", OBJ_nid2sn(nid)); - if (SSL_get_peer_signature_type_nid(s, &nid)) - BIO_printf(bio_err, "Signature type: %s\n", get_sigtype(nid)); - print_verify_detail(s, bio_err); - } else { - BIO_puts(bio_err, "No peer certificate\n"); - } - X509_free(peer); -#ifndef OPENSSL_NO_EC - ssl_print_point_formats(bio_err, s); - if (SSL_is_server(s)) - ssl_print_groups(bio_err, s, 1); - else - ssl_print_tmp_key(bio_err, s); -#else - if (!SSL_is_server(s)) - ssl_print_tmp_key(bio_err, s); -#endif -} - -int config_ctx(SSL_CONF_CTX *cctx, STACK_OF(OPENSSL_STRING) *str, - SSL_CTX *ctx) -{ - int i; - - SSL_CONF_CTX_set_ssl_ctx(cctx, ctx); - for (i = 0; i < sk_OPENSSL_STRING_num(str); i += 2) { - const char *flag = sk_OPENSSL_STRING_value(str, i); - const char *arg = sk_OPENSSL_STRING_value(str, i + 1); - if (SSL_CONF_cmd(cctx, flag, arg) <= 0) { - if (arg != NULL) - BIO_printf(bio_err, "Error with command: \"%s %s\"\n", - flag, arg); - else - BIO_printf(bio_err, "Error with command: \"%s\"\n", flag); - ERR_print_errors(bio_err); - return 0; - } - } - if (!SSL_CONF_CTX_finish(cctx)) { - BIO_puts(bio_err, "Error finishing context\n"); - ERR_print_errors(bio_err); - return 0; - } - return 1; -} - -static int add_crls_store(X509_STORE *st, STACK_OF(X509_CRL) *crls) -{ - X509_CRL *crl; - int i; - for (i = 0; i < sk_X509_CRL_num(crls); i++) { - crl = sk_X509_CRL_value(crls, i); - X509_STORE_add_crl(st, crl); - } - return 1; -} - -int ssl_ctx_add_crls(SSL_CTX *ctx, STACK_OF(X509_CRL) *crls, int crl_download) -{ - X509_STORE *st; - st = SSL_CTX_get_cert_store(ctx); - add_crls_store(st, crls); - if (crl_download) - store_setup_crl_download(st); - return 1; -} - -int ssl_load_stores(SSL_CTX *ctx, - const char *vfyCApath, const char *vfyCAfile, - const char *chCApath, const char *chCAfile, - STACK_OF(X509_CRL) *crls, int crl_download) -{ - X509_STORE *vfy = NULL, *ch = NULL; - int rv = 0; - if (vfyCApath != NULL || vfyCAfile != NULL) { - vfy = X509_STORE_new(); - if (vfy == NULL) - goto err; - if (!X509_STORE_load_locations(vfy, vfyCAfile, vfyCApath)) - goto err; - add_crls_store(vfy, crls); - SSL_CTX_set1_verify_cert_store(ctx, vfy); - if (crl_download) - store_setup_crl_download(vfy); - } - if (chCApath != NULL || chCAfile != NULL) { - ch = X509_STORE_new(); - if (ch == NULL) - goto err; - if (!X509_STORE_load_locations(ch, chCAfile, chCApath)) - goto err; - SSL_CTX_set1_chain_cert_store(ctx, ch); - } - rv = 1; - err: - X509_STORE_free(vfy); - X509_STORE_free(ch); - return rv; -} - -/* Verbose print out of security callback */ - -typedef struct { - BIO *out; - int verbose; - int (*old_cb) (const SSL *s, const SSL_CTX *ctx, int op, int bits, int nid, - void *other, void *ex); -} security_debug_ex; - -static STRINT_PAIR callback_types[] = { - {"Supported Ciphersuite", SSL_SECOP_CIPHER_SUPPORTED}, - {"Shared Ciphersuite", SSL_SECOP_CIPHER_SHARED}, - {"Check Ciphersuite", SSL_SECOP_CIPHER_CHECK}, -#ifndef OPENSSL_NO_DH - {"Temp DH key bits", SSL_SECOP_TMP_DH}, -#endif - {"Supported Curve", SSL_SECOP_CURVE_SUPPORTED}, - {"Shared Curve", SSL_SECOP_CURVE_SHARED}, - {"Check Curve", SSL_SECOP_CURVE_CHECK}, - {"Supported Signature Algorithm", SSL_SECOP_SIGALG_SUPPORTED}, - {"Shared Signature Algorithm", SSL_SECOP_SIGALG_SHARED}, - {"Check Signature Algorithm", SSL_SECOP_SIGALG_CHECK}, - {"Signature Algorithm mask", SSL_SECOP_SIGALG_MASK}, - {"Certificate chain EE key", SSL_SECOP_EE_KEY}, - {"Certificate chain CA key", SSL_SECOP_CA_KEY}, - {"Peer Chain EE key", SSL_SECOP_PEER_EE_KEY}, - {"Peer Chain CA key", SSL_SECOP_PEER_CA_KEY}, - {"Certificate chain CA digest", SSL_SECOP_CA_MD}, - {"Peer chain CA digest", SSL_SECOP_PEER_CA_MD}, - {"SSL compression", SSL_SECOP_COMPRESSION}, - {"Session ticket", SSL_SECOP_TICKET}, - {NULL} -}; - -static int security_callback_debug(const SSL *s, const SSL_CTX *ctx, - int op, int bits, int nid, - void *other, void *ex) -{ - security_debug_ex *sdb = ex; - int rv, show_bits = 1, cert_md = 0; - const char *nm; - int show_nm; - rv = sdb->old_cb(s, ctx, op, bits, nid, other, ex); - if (rv == 1 && sdb->verbose < 2) - return 1; - BIO_puts(sdb->out, "Security callback: "); - - nm = lookup(op, callback_types, NULL); - show_nm = nm != NULL; - switch (op) { - case SSL_SECOP_TICKET: - case SSL_SECOP_COMPRESSION: - show_bits = 0; - show_nm = 0; - break; - case SSL_SECOP_VERSION: - BIO_printf(sdb->out, "Version=%s", lookup(nid, ssl_versions, "???")); - show_bits = 0; - show_nm = 0; - break; - case SSL_SECOP_CA_MD: - case SSL_SECOP_PEER_CA_MD: - cert_md = 1; - break; - case SSL_SECOP_SIGALG_SUPPORTED: - case SSL_SECOP_SIGALG_SHARED: - case SSL_SECOP_SIGALG_CHECK: - case SSL_SECOP_SIGALG_MASK: - show_nm = 0; - break; - } - if (show_nm) - BIO_printf(sdb->out, "%s=", nm); - - switch (op & SSL_SECOP_OTHER_TYPE) { - - case SSL_SECOP_OTHER_CIPHER: - BIO_puts(sdb->out, SSL_CIPHER_get_name(other)); - break; - -#ifndef OPENSSL_NO_EC - case SSL_SECOP_OTHER_CURVE: - { - const char *cname; - cname = EC_curve_nid2nist(nid); - if (cname == NULL) - cname = OBJ_nid2sn(nid); - BIO_puts(sdb->out, cname); - } - break; -#endif -#ifndef OPENSSL_NO_DH - case SSL_SECOP_OTHER_DH: - { - DH *dh = other; - BIO_printf(sdb->out, "%d", DH_bits(dh)); - break; - } -#endif - case SSL_SECOP_OTHER_CERT: - { - if (cert_md) { - int sig_nid = X509_get_signature_nid(other); - BIO_puts(sdb->out, OBJ_nid2sn(sig_nid)); - } else { - EVP_PKEY *pkey = X509_get0_pubkey(other); - const char *algname = ""; - EVP_PKEY_asn1_get0_info(NULL, NULL, NULL, NULL, - &algname, EVP_PKEY_get0_asn1(pkey)); - BIO_printf(sdb->out, "%s, bits=%d", - algname, EVP_PKEY_bits(pkey)); - } - break; - } - case SSL_SECOP_OTHER_SIGALG: - { - const unsigned char *salg = other; - const char *sname = NULL; - int raw_sig_code = (salg[0] << 8) + salg[1]; /* always big endian (msb, lsb) */ - /* raw_sig_code: signature_scheme from tls1.3, or signature_and_hash from tls1.2 */ - - if (nm != NULL) - BIO_printf(sdb->out, "%s", nm); - else - BIO_printf(sdb->out, "s_cb.c:security_callback_debug op=0x%x", op); - - sname = lookup(raw_sig_code, signature_tls13_scheme_list, NULL); - if (sname != NULL) { - BIO_printf(sdb->out, " scheme=%s", sname); - } else { - int alg_code = salg[1]; - int hash_code = salg[0]; - const char *alg_str = lookup(alg_code, signature_tls12_alg_list, NULL); - const char *hash_str = lookup(hash_code, signature_tls12_hash_list, NULL); - - if (alg_str != NULL && hash_str != NULL) - BIO_printf(sdb->out, " digest=%s, algorithm=%s", hash_str, alg_str); - else - BIO_printf(sdb->out, " scheme=unknown(0x%04x)", raw_sig_code); - } - } - - } - - if (show_bits) - BIO_printf(sdb->out, ", security bits=%d", bits); - BIO_printf(sdb->out, ": %s\n", rv ? "yes" : "no"); - return rv; -} - -void ssl_ctx_security_debug(SSL_CTX *ctx, int verbose) -{ - static security_debug_ex sdb; - - sdb.out = bio_err; - sdb.verbose = verbose; - sdb.old_cb = SSL_CTX_get_security_callback(ctx); - SSL_CTX_set_security_callback(ctx, security_callback_debug); - SSL_CTX_set0_security_ex_data(ctx, &sdb); -} - -static void keylog_callback(const SSL *ssl, const char *line) -{ - if (bio_keylog == NULL) { - BIO_printf(bio_err, "Keylog callback is invoked without valid file!\n"); - return; - } - - /* - * There might be concurrent writers to the keylog file, so we must ensure - * that the given line is written at once. - */ - BIO_printf(bio_keylog, "%s\n", line); - (void)BIO_flush(bio_keylog); -} - -int set_keylog_file(SSL_CTX *ctx, const char *keylog_file) -{ - /* Close any open files */ - BIO_free_all(bio_keylog); - bio_keylog = NULL; - - if (ctx == NULL || keylog_file == NULL) { - /* Keylogging is disabled, OK. */ - return 0; - } - - /* - * Append rather than write in order to allow concurrent modification. - * Furthermore, this preserves existing keylog files which is useful when - * the tool is run multiple times. - */ - bio_keylog = BIO_new_file(keylog_file, "a"); - if (bio_keylog == NULL) { - BIO_printf(bio_err, "Error writing keylog file %s\n", keylog_file); - return 1; - } - - /* Write a header for seekable, empty files (this excludes pipes). */ - if (BIO_tell(bio_keylog) == 0) { - BIO_puts(bio_keylog, - "# SSL/TLS secrets log file, generated by OpenSSL\n"); - (void)BIO_flush(bio_keylog); - } - SSL_CTX_set_keylog_callback(ctx, keylog_callback); - return 0; -} - -void print_ca_names(BIO *bio, SSL *s) -{ - const char *cs = SSL_is_server(s) ? "server" : "client"; - const STACK_OF(X509_NAME) *sk = SSL_get0_peer_CA_list(s); - int i; - - if (sk == NULL || sk_X509_NAME_num(sk) == 0) { - if (!SSL_is_server(s)) - BIO_printf(bio, "---\nNo %s certificate CA names sent\n", cs); - return; - } - - BIO_printf(bio, "---\nAcceptable %s certificate CA names\n",cs); - for (i = 0; i < sk_X509_NAME_num(sk); i++) { - X509_NAME_print_ex(bio, sk_X509_NAME_value(sk, i), 0, get_nameopt()); - BIO_write(bio, "\n", 1); - } -} diff --git a/contrib/libs/openssl/apps/s_client.c b/contrib/libs/openssl/apps/s_client.c deleted file mode 100644 index 83b3fc9c7f..0000000000 --- a/contrib/libs/openssl/apps/s_client.c +++ /dev/null @@ -1,3564 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * Copyright 2005 Nokia. All rights reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "e_os.h" -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <openssl/e_os2.h> - -#ifndef OPENSSL_NO_SOCK - -/* - * With IPv6, it looks like Digital has mixed up the proper order of - * recursive header file inclusion, resulting in the compiler complaining - * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is - * needed to have fileno() declared correctly... So let's define u_int - */ -#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) -# define __U_INT -typedef unsigned int u_int; -#endif - -#include "apps.h" -#include "progs.h" -#include <openssl/x509.h> -#include <openssl/ssl.h> -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/rand.h> -#include <openssl/ocsp.h> -#include <openssl/bn.h> -#include <openssl/async.h> -#ifndef OPENSSL_NO_SRP -# include <openssl/srp.h> -#endif -#ifndef OPENSSL_NO_CT -# include <openssl/ct.h> -#endif -#include "s_apps.h" -#include "timeouts.h" -#include "internal/sockets.h" - -#if defined(__has_feature) -# if __has_feature(memory_sanitizer) -# include <sanitizer/msan_interface.h> -# endif -#endif - -#undef BUFSIZZ -#define BUFSIZZ 1024*8 -#define S_CLIENT_IRC_READ_TIMEOUT 8 - -static char *prog; -static int c_debug = 0; -static int c_showcerts = 0; -static char *keymatexportlabel = NULL; -static int keymatexportlen = 20; -static BIO *bio_c_out = NULL; -static int c_quiet = 0; -static char *sess_out = NULL; -static SSL_SESSION *psksess = NULL; - -static void print_stuff(BIO *berr, SSL *con, int full); -#ifndef OPENSSL_NO_OCSP -static int ocsp_resp_cb(SSL *s, void *arg); -#endif -static int ldap_ExtendedResponse_parse(const char *buf, long rem); -static int is_dNS_name(const char *host); - -static int saved_errno; - -static void save_errno(void) -{ - saved_errno = errno; - errno = 0; -} - -static int restore_errno(void) -{ - int ret = errno; - errno = saved_errno; - return ret; -} - -static void do_ssl_shutdown(SSL *ssl) -{ - int ret; - - do { - /* We only do unidirectional shutdown */ - ret = SSL_shutdown(ssl); - if (ret < 0) { - switch (SSL_get_error(ssl, ret)) { - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - case SSL_ERROR_WANT_ASYNC: - case SSL_ERROR_WANT_ASYNC_JOB: - /* We just do busy waiting. Nothing clever */ - continue; - } - ret = 0; - } - } while (ret < 0); -} - -/* Default PSK identity and key */ -static char *psk_identity = "Client_identity"; - -#ifndef OPENSSL_NO_PSK -static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity, - unsigned int max_identity_len, - unsigned char *psk, - unsigned int max_psk_len) -{ - int ret; - long key_len; - unsigned char *key; - - if (c_debug) - BIO_printf(bio_c_out, "psk_client_cb\n"); - if (!hint) { - /* no ServerKeyExchange message */ - if (c_debug) - BIO_printf(bio_c_out, - "NULL received PSK identity hint, continuing anyway\n"); - } else if (c_debug) { - BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint); - } - - /* - * lookup PSK identity and PSK key based on the given identity hint here - */ - ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity); - if (ret < 0 || (unsigned int)ret > max_identity_len) - goto out_err; - if (c_debug) - BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, - ret); - - /* convert the PSK key to binary */ - key = OPENSSL_hexstr2buf(psk_key, &key_len); - if (key == NULL) { - BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n", - psk_key); - return 0; - } - if (max_psk_len > INT_MAX || key_len > (long)max_psk_len) { - BIO_printf(bio_err, - "psk buffer of callback is too small (%d) for key (%ld)\n", - max_psk_len, key_len); - OPENSSL_free(key); - return 0; - } - - memcpy(psk, key, key_len); - OPENSSL_free(key); - - if (c_debug) - BIO_printf(bio_c_out, "created PSK len=%ld\n", key_len); - - return key_len; - out_err: - if (c_debug) - BIO_printf(bio_err, "Error in PSK client callback\n"); - return 0; -} -#endif - -const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 }; -const unsigned char tls13_aes256gcmsha384_id[] = { 0x13, 0x02 }; - -static int psk_use_session_cb(SSL *s, const EVP_MD *md, - const unsigned char **id, size_t *idlen, - SSL_SESSION **sess) -{ - SSL_SESSION *usesess = NULL; - const SSL_CIPHER *cipher = NULL; - - if (psksess != NULL) { - SSL_SESSION_up_ref(psksess); - usesess = psksess; - } else { - long key_len; - unsigned char *key = OPENSSL_hexstr2buf(psk_key, &key_len); - - if (key == NULL) { - BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n", - psk_key); - return 0; - } - - /* We default to SHA-256 */ - cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id); - if (cipher == NULL) { - BIO_printf(bio_err, "Error finding suitable ciphersuite\n"); - OPENSSL_free(key); - return 0; - } - - usesess = SSL_SESSION_new(); - if (usesess == NULL - || !SSL_SESSION_set1_master_key(usesess, key, key_len) - || !SSL_SESSION_set_cipher(usesess, cipher) - || !SSL_SESSION_set_protocol_version(usesess, TLS1_3_VERSION)) { - OPENSSL_free(key); - goto err; - } - OPENSSL_free(key); - } - - cipher = SSL_SESSION_get0_cipher(usesess); - if (cipher == NULL) - goto err; - - if (md != NULL && SSL_CIPHER_get_handshake_digest(cipher) != md) { - /* PSK not usable, ignore it */ - *id = NULL; - *idlen = 0; - *sess = NULL; - SSL_SESSION_free(usesess); - } else { - *sess = usesess; - *id = (unsigned char *)psk_identity; - *idlen = strlen(psk_identity); - } - - return 1; - - err: - SSL_SESSION_free(usesess); - return 0; -} - -/* This is a context that we pass to callbacks */ -typedef struct tlsextctx_st { - BIO *biodebug; - int ack; -} tlsextctx; - -static int ssl_servername_cb(SSL *s, int *ad, void *arg) -{ - tlsextctx *p = (tlsextctx *) arg; - const char *hn = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name); - if (SSL_get_servername_type(s) != -1) - p->ack = !SSL_session_reused(s) && hn != NULL; - else - BIO_printf(bio_err, "Can't use SSL_get_servername\n"); - - return SSL_TLSEXT_ERR_OK; -} - -#ifndef OPENSSL_NO_SRP - -/* This is a context that we pass to all callbacks */ -typedef struct srp_arg_st { - char *srppassin; - char *srplogin; - int msg; /* copy from c_msg */ - int debug; /* copy from c_debug */ - int amp; /* allow more groups */ - int strength; /* minimal size for N */ -} SRP_ARG; - -# define SRP_NUMBER_ITERATIONS_FOR_PRIME 64 - -static int srp_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g) -{ - BN_CTX *bn_ctx = BN_CTX_new(); - BIGNUM *p = BN_new(); - BIGNUM *r = BN_new(); - int ret = - g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) && - BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) == 1 && - p != NULL && BN_rshift1(p, N) && - /* p = (N-1)/2 */ - BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) == 1 && - r != NULL && - /* verify g^((N-1)/2) == -1 (mod N) */ - BN_mod_exp(r, g, p, N, bn_ctx) && - BN_add_word(r, 1) && BN_cmp(r, N) == 0; - - BN_free(r); - BN_free(p); - BN_CTX_free(bn_ctx); - return ret; -} - -/*- - * This callback is used here for two purposes: - * - extended debugging - * - making some primality tests for unknown groups - * The callback is only called for a non default group. - * - * An application does not need the call back at all if - * only the standard groups are used. In real life situations, - * client and server already share well known groups, - * thus there is no need to verify them. - * Furthermore, in case that a server actually proposes a group that - * is not one of those defined in RFC 5054, it is more appropriate - * to add the group to a static list and then compare since - * primality tests are rather cpu consuming. - */ - -static int ssl_srp_verify_param_cb(SSL *s, void *arg) -{ - SRP_ARG *srp_arg = (SRP_ARG *)arg; - BIGNUM *N = NULL, *g = NULL; - - if (((N = SSL_get_srp_N(s)) == NULL) || ((g = SSL_get_srp_g(s)) == NULL)) - return 0; - if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1) { - BIO_printf(bio_err, "SRP parameters:\n"); - BIO_printf(bio_err, "\tN="); - BN_print(bio_err, N); - BIO_printf(bio_err, "\n\tg="); - BN_print(bio_err, g); - BIO_printf(bio_err, "\n"); - } - - if (SRP_check_known_gN_param(g, N)) - return 1; - - if (srp_arg->amp == 1) { - if (srp_arg->debug) - BIO_printf(bio_err, - "SRP param N and g are not known params, going to check deeper.\n"); - - /* - * The srp_moregroups is a real debugging feature. Implementors - * should rather add the value to the known ones. The minimal size - * has already been tested. - */ - if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N, g)) - return 1; - } - BIO_printf(bio_err, "SRP param N and g rejected.\n"); - return 0; -} - -# define PWD_STRLEN 1024 - -static char *ssl_give_srp_client_pwd_cb(SSL *s, void *arg) -{ - SRP_ARG *srp_arg = (SRP_ARG *)arg; - char *pass = app_malloc(PWD_STRLEN + 1, "SRP password buffer"); - PW_CB_DATA cb_tmp; - int l; - - cb_tmp.password = (char *)srp_arg->srppassin; - cb_tmp.prompt_info = "SRP user"; - if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp)) < 0) { - BIO_printf(bio_err, "Can't read Password\n"); - OPENSSL_free(pass); - return NULL; - } - *(pass + l) = '\0'; - - return pass; -} - -#endif - -#ifndef OPENSSL_NO_NEXTPROTONEG -/* This the context that we pass to next_proto_cb */ -typedef struct tlsextnextprotoctx_st { - unsigned char *data; - size_t len; - int status; -} tlsextnextprotoctx; - -static tlsextnextprotoctx next_proto; - -static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, - const unsigned char *in, unsigned int inlen, - void *arg) -{ - tlsextnextprotoctx *ctx = arg; - - if (!c_quiet) { - /* We can assume that |in| is syntactically valid. */ - unsigned i; - BIO_printf(bio_c_out, "Protocols advertised by server: "); - for (i = 0; i < inlen;) { - if (i) - BIO_write(bio_c_out, ", ", 2); - BIO_write(bio_c_out, &in[i + 1], in[i]); - i += in[i] + 1; - } - BIO_write(bio_c_out, "\n", 1); - } - - ctx->status = - SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len); - return SSL_TLSEXT_ERR_OK; -} -#endif /* ndef OPENSSL_NO_NEXTPROTONEG */ - -static int serverinfo_cli_parse_cb(SSL *s, unsigned int ext_type, - const unsigned char *in, size_t inlen, - int *al, void *arg) -{ - char pem_name[100]; - unsigned char ext_buf[4 + 65536]; - - /* Reconstruct the type/len fields prior to extension data */ - inlen &= 0xffff; /* for formal memcmpy correctness */ - ext_buf[0] = (unsigned char)(ext_type >> 8); - ext_buf[1] = (unsigned char)(ext_type); - ext_buf[2] = (unsigned char)(inlen >> 8); - ext_buf[3] = (unsigned char)(inlen); - memcpy(ext_buf + 4, in, inlen); - - BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d", - ext_type); - PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen); - return 1; -} - -/* - * Hex decoder that tolerates optional whitespace. Returns number of bytes - * produced, advances inptr to end of input string. - */ -static ossl_ssize_t hexdecode(const char **inptr, void *result) -{ - unsigned char **out = (unsigned char **)result; - const char *in = *inptr; - unsigned char *ret = app_malloc(strlen(in) / 2, "hexdecode"); - unsigned char *cp = ret; - uint8_t byte; - int nibble = 0; - - if (ret == NULL) - return -1; - - for (byte = 0; *in; ++in) { - int x; - - if (isspace(_UC(*in))) - continue; - x = OPENSSL_hexchar2int(*in); - if (x < 0) { - OPENSSL_free(ret); - return 0; - } - byte |= (char)x; - if ((nibble ^= 1) == 0) { - *cp++ = byte; - byte = 0; - } else { - byte <<= 4; - } - } - if (nibble != 0) { - OPENSSL_free(ret); - return 0; - } - *inptr = in; - - return cp - (*out = ret); -} - -/* - * Decode unsigned 0..255, returns 1 on success, <= 0 on failure. Advances - * inptr to next field skipping leading whitespace. - */ -static ossl_ssize_t checked_uint8(const char **inptr, void *out) -{ - uint8_t *result = (uint8_t *)out; - const char *in = *inptr; - char *endp; - long v; - int e; - - save_errno(); - v = strtol(in, &endp, 10); - e = restore_errno(); - - if (((v == LONG_MIN || v == LONG_MAX) && e == ERANGE) || - endp == in || !isspace(_UC(*endp)) || - v != (*result = (uint8_t) v)) { - return -1; - } - for (in = endp; isspace(_UC(*in)); ++in) - continue; - - *inptr = in; - return 1; -} - -struct tlsa_field { - void *var; - const char *name; - ossl_ssize_t (*parser)(const char **, void *); -}; - -static int tlsa_import_rr(SSL *con, const char *rrdata) -{ - /* Not necessary to re-init these values; the "parsers" do that. */ - static uint8_t usage; - static uint8_t selector; - static uint8_t mtype; - static unsigned char *data; - static struct tlsa_field tlsa_fields[] = { - { &usage, "usage", checked_uint8 }, - { &selector, "selector", checked_uint8 }, - { &mtype, "mtype", checked_uint8 }, - { &data, "data", hexdecode }, - { NULL, } - }; - struct tlsa_field *f; - int ret; - const char *cp = rrdata; - ossl_ssize_t len = 0; - - for (f = tlsa_fields; f->var; ++f) { - /* Returns number of bytes produced, advances cp to next field */ - if ((len = f->parser(&cp, f->var)) <= 0) { - BIO_printf(bio_err, "%s: warning: bad TLSA %s field in: %s\n", - prog, f->name, rrdata); - return 0; - } - } - /* The data field is last, so len is its length */ - ret = SSL_dane_tlsa_add(con, usage, selector, mtype, data, len); - OPENSSL_free(data); - - if (ret == 0) { - ERR_print_errors(bio_err); - BIO_printf(bio_err, "%s: warning: unusable TLSA rrdata: %s\n", - prog, rrdata); - return 0; - } - if (ret < 0) { - ERR_print_errors(bio_err); - BIO_printf(bio_err, "%s: warning: error loading TLSA rrdata: %s\n", - prog, rrdata); - return 0; - } - return ret; -} - -static int tlsa_import_rrset(SSL *con, STACK_OF(OPENSSL_STRING) *rrset) -{ - int num = sk_OPENSSL_STRING_num(rrset); - int count = 0; - int i; - - for (i = 0; i < num; ++i) { - char *rrdata = sk_OPENSSL_STRING_value(rrset, i); - if (tlsa_import_rr(con, rrdata) > 0) - ++count; - } - return count > 0; -} - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_4, OPT_6, OPT_HOST, OPT_PORT, OPT_CONNECT, OPT_BIND, OPT_UNIX, - OPT_XMPPHOST, OPT_VERIFY, OPT_NAMEOPT, - OPT_CERT, OPT_CRL, OPT_CRL_DOWNLOAD, OPT_SESS_OUT, OPT_SESS_IN, - OPT_CERTFORM, OPT_CRLFORM, OPT_VERIFY_RET_ERROR, OPT_VERIFY_QUIET, - OPT_BRIEF, OPT_PREXIT, OPT_CRLF, OPT_QUIET, OPT_NBIO, - OPT_SSL_CLIENT_ENGINE, OPT_IGN_EOF, OPT_NO_IGN_EOF, - OPT_DEBUG, OPT_TLSEXTDEBUG, OPT_STATUS, OPT_WDEBUG, - OPT_MSG, OPT_MSGFILE, OPT_ENGINE, OPT_TRACE, OPT_SECURITY_DEBUG, - OPT_SECURITY_DEBUG_VERBOSE, OPT_SHOWCERTS, OPT_NBIO_TEST, OPT_STATE, - OPT_PSK_IDENTITY, OPT_PSK, OPT_PSK_SESS, -#ifndef OPENSSL_NO_SRP - OPT_SRPUSER, OPT_SRPPASS, OPT_SRP_STRENGTH, OPT_SRP_LATEUSER, - OPT_SRP_MOREGROUPS, -#endif - OPT_SSL3, OPT_SSL_CONFIG, - OPT_TLS1_3, OPT_TLS1_2, OPT_TLS1_1, OPT_TLS1, OPT_DTLS, OPT_DTLS1, - OPT_DTLS1_2, OPT_SCTP, OPT_TIMEOUT, OPT_MTU, OPT_KEYFORM, OPT_PASS, - OPT_CERT_CHAIN, OPT_CAPATH, OPT_NOCAPATH, OPT_CHAINCAPATH, OPT_VERIFYCAPATH, - OPT_KEY, OPT_RECONNECT, OPT_BUILD_CHAIN, OPT_CAFILE, OPT_NOCAFILE, - OPT_CHAINCAFILE, OPT_VERIFYCAFILE, OPT_NEXTPROTONEG, OPT_ALPN, - OPT_SERVERINFO, OPT_STARTTLS, OPT_SERVERNAME, OPT_NOSERVERNAME, OPT_ASYNC, - OPT_USE_SRTP, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN, OPT_PROTOHOST, - OPT_MAXFRAGLEN, OPT_MAX_SEND_FRAG, OPT_SPLIT_SEND_FRAG, OPT_MAX_PIPELINES, - OPT_READ_BUF, OPT_KEYLOG_FILE, OPT_EARLY_DATA, OPT_REQCAFILE, - OPT_V_ENUM, - OPT_X_ENUM, - OPT_S_ENUM, - OPT_FALLBACKSCSV, OPT_NOCMDS, OPT_PROXY, OPT_DANE_TLSA_DOMAIN, -#ifndef OPENSSL_NO_CT - OPT_CT, OPT_NOCT, OPT_CTLOG_FILE, -#endif - OPT_DANE_TLSA_RRDATA, OPT_DANE_EE_NO_NAME, - OPT_ENABLE_PHA, - OPT_SCTP_LABEL_BUG, - OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS s_client_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"host", OPT_HOST, 's', "Use -connect instead"}, - {"port", OPT_PORT, 'p', "Use -connect instead"}, - {"connect", OPT_CONNECT, 's', - "TCP/IP where to connect (default is :" PORT ")"}, - {"bind", OPT_BIND, 's', "bind local address for connection"}, - {"proxy", OPT_PROXY, 's', - "Connect to via specified proxy to the real server"}, -#ifdef AF_UNIX - {"unix", OPT_UNIX, 's', "Connect over the specified Unix-domain socket"}, -#endif - {"4", OPT_4, '-', "Use IPv4 only"}, -#ifdef AF_INET6 - {"6", OPT_6, '-', "Use IPv6 only"}, -#endif - {"verify", OPT_VERIFY, 'p', "Turn on peer certificate verification"}, - {"cert", OPT_CERT, '<', "Certificate file to use, PEM format assumed"}, - {"certform", OPT_CERTFORM, 'F', - "Certificate format (PEM or DER) PEM default"}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - {"key", OPT_KEY, 's', "Private key file to use, if not in -cert file"}, - {"keyform", OPT_KEYFORM, 'E', "Key format (PEM, DER or engine) PEM default"}, - {"pass", OPT_PASS, 's', "Private key file pass phrase source"}, - {"CApath", OPT_CAPATH, '/', "PEM format directory of CA's"}, - {"CAfile", OPT_CAFILE, '<', "PEM format file of CA's"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"requestCAfile", OPT_REQCAFILE, '<', - "PEM format file of CA names to send to the server"}, - {"dane_tlsa_domain", OPT_DANE_TLSA_DOMAIN, 's', "DANE TLSA base domain"}, - {"dane_tlsa_rrdata", OPT_DANE_TLSA_RRDATA, 's', - "DANE TLSA rrdata presentation form"}, - {"dane_ee_no_namechecks", OPT_DANE_EE_NO_NAME, '-', - "Disable name checks when matching DANE-EE(3) TLSA records"}, - {"reconnect", OPT_RECONNECT, '-', - "Drop and re-make the connection with the same Session-ID"}, - {"showcerts", OPT_SHOWCERTS, '-', - "Show all certificates sent by the server"}, - {"debug", OPT_DEBUG, '-', "Extra output"}, - {"msg", OPT_MSG, '-', "Show protocol messages"}, - {"msgfile", OPT_MSGFILE, '>', - "File to send output of -msg or -trace, instead of stdout"}, - {"nbio_test", OPT_NBIO_TEST, '-', "More ssl protocol testing"}, - {"state", OPT_STATE, '-', "Print the ssl states"}, - {"crlf", OPT_CRLF, '-', "Convert LF from terminal into CRLF"}, - {"quiet", OPT_QUIET, '-', "No s_client output"}, - {"ign_eof", OPT_IGN_EOF, '-', "Ignore input eof (default when -quiet)"}, - {"no_ign_eof", OPT_NO_IGN_EOF, '-', "Don't ignore input eof"}, - {"starttls", OPT_STARTTLS, 's', - "Use the appropriate STARTTLS command before starting TLS"}, - {"xmpphost", OPT_XMPPHOST, 's', - "Alias of -name option for \"-starttls xmpp[-server]\""}, - OPT_R_OPTIONS, - {"sess_out", OPT_SESS_OUT, '>', "File to write SSL session to"}, - {"sess_in", OPT_SESS_IN, '<', "File to read SSL session from"}, -#ifndef OPENSSL_NO_SRTP - {"use_srtp", OPT_USE_SRTP, 's', - "Offer SRTP key management with a colon-separated profile list"}, -#endif - {"keymatexport", OPT_KEYMATEXPORT, 's', - "Export keying material using label"}, - {"keymatexportlen", OPT_KEYMATEXPORTLEN, 'p', - "Export len bytes of keying material (default 20)"}, - {"maxfraglen", OPT_MAXFRAGLEN, 'p', - "Enable Maximum Fragment Length Negotiation (len values: 512, 1024, 2048 and 4096)"}, - {"fallback_scsv", OPT_FALLBACKSCSV, '-', "Send the fallback SCSV"}, - {"name", OPT_PROTOHOST, 's', - "Hostname to use for \"-starttls lmtp\", \"-starttls smtp\" or \"-starttls xmpp[-server]\""}, - {"CRL", OPT_CRL, '<', "CRL file to use"}, - {"crl_download", OPT_CRL_DOWNLOAD, '-', "Download CRL from distribution points"}, - {"CRLform", OPT_CRLFORM, 'F', "CRL format (PEM or DER) PEM is default"}, - {"verify_return_error", OPT_VERIFY_RET_ERROR, '-', - "Close connection on verification error"}, - {"verify_quiet", OPT_VERIFY_QUIET, '-', "Restrict verify output to errors"}, - {"brief", OPT_BRIEF, '-', - "Restrict output to brief summary of connection parameters"}, - {"prexit", OPT_PREXIT, '-', - "Print session information when the program exits"}, - {"security_debug", OPT_SECURITY_DEBUG, '-', - "Enable security debug messages"}, - {"security_debug_verbose", OPT_SECURITY_DEBUG_VERBOSE, '-', - "Output more security debug output"}, - {"cert_chain", OPT_CERT_CHAIN, '<', - "Certificate chain file (in PEM format)"}, - {"chainCApath", OPT_CHAINCAPATH, '/', - "Use dir as certificate store path to build CA certificate chain"}, - {"verifyCApath", OPT_VERIFYCAPATH, '/', - "Use dir as certificate store path to verify CA certificate"}, - {"build_chain", OPT_BUILD_CHAIN, '-', "Build certificate chain"}, - {"chainCAfile", OPT_CHAINCAFILE, '<', - "CA file for certificate chain (PEM format)"}, - {"verifyCAfile", OPT_VERIFYCAFILE, '<', - "CA file for certificate verification (PEM format)"}, - {"nocommands", OPT_NOCMDS, '-', "Do not use interactive command letters"}, - {"servername", OPT_SERVERNAME, 's', - "Set TLS extension servername (SNI) in ClientHello (default)"}, - {"noservername", OPT_NOSERVERNAME, '-', - "Do not send the server name (SNI) extension in the ClientHello"}, - {"tlsextdebug", OPT_TLSEXTDEBUG, '-', - "Hex dump of all TLS extensions received"}, -#ifndef OPENSSL_NO_OCSP - {"status", OPT_STATUS, '-', "Request certificate status from server"}, -#endif - {"serverinfo", OPT_SERVERINFO, 's', - "types Send empty ClientHello extensions (comma-separated numbers)"}, - {"alpn", OPT_ALPN, 's', - "Enable ALPN extension, considering named protocols supported (comma-separated list)"}, - {"async", OPT_ASYNC, '-', "Support asynchronous operation"}, - {"ssl_config", OPT_SSL_CONFIG, 's', "Use specified configuration file"}, - {"max_send_frag", OPT_MAX_SEND_FRAG, 'p', "Maximum Size of send frames "}, - {"split_send_frag", OPT_SPLIT_SEND_FRAG, 'p', - "Size used to split data for encrypt pipelines"}, - {"max_pipelines", OPT_MAX_PIPELINES, 'p', - "Maximum number of encrypt/decrypt pipelines to be used"}, - {"read_buf", OPT_READ_BUF, 'p', - "Default read buffer size to be used for connections"}, - OPT_S_OPTIONS, - OPT_V_OPTIONS, - OPT_X_OPTIONS, -#ifndef OPENSSL_NO_SSL3 - {"ssl3", OPT_SSL3, '-', "Just use SSLv3"}, -#endif -#ifndef OPENSSL_NO_TLS1 - {"tls1", OPT_TLS1, '-', "Just use TLSv1"}, -#endif -#ifndef OPENSSL_NO_TLS1_1 - {"tls1_1", OPT_TLS1_1, '-', "Just use TLSv1.1"}, -#endif -#ifndef OPENSSL_NO_TLS1_2 - {"tls1_2", OPT_TLS1_2, '-', "Just use TLSv1.2"}, -#endif -#ifndef OPENSSL_NO_TLS1_3 - {"tls1_3", OPT_TLS1_3, '-', "Just use TLSv1.3"}, -#endif -#ifndef OPENSSL_NO_DTLS - {"dtls", OPT_DTLS, '-', "Use any version of DTLS"}, - {"timeout", OPT_TIMEOUT, '-', - "Enable send/receive timeout on DTLS connections"}, - {"mtu", OPT_MTU, 'p', "Set the link layer MTU"}, -#endif -#ifndef OPENSSL_NO_DTLS1 - {"dtls1", OPT_DTLS1, '-', "Just use DTLSv1"}, -#endif -#ifndef OPENSSL_NO_DTLS1_2 - {"dtls1_2", OPT_DTLS1_2, '-', "Just use DTLSv1.2"}, -#endif -#ifndef OPENSSL_NO_SCTP - {"sctp", OPT_SCTP, '-', "Use SCTP"}, - {"sctp_label_bug", OPT_SCTP_LABEL_BUG, '-', "Enable SCTP label length bug"}, -#endif -#ifndef OPENSSL_NO_SSL_TRACE - {"trace", OPT_TRACE, '-', "Show trace output of protocol messages"}, -#endif -#ifdef WATT32 - {"wdebug", OPT_WDEBUG, '-', "WATT-32 tcp debugging"}, -#endif - {"nbio", OPT_NBIO, '-', "Use non-blocking IO"}, - {"psk_identity", OPT_PSK_IDENTITY, 's', "PSK identity"}, - {"psk", OPT_PSK, 's', "PSK in hex (without 0x)"}, - {"psk_session", OPT_PSK_SESS, '<', "File to read PSK SSL session from"}, -#ifndef OPENSSL_NO_SRP - {"srpuser", OPT_SRPUSER, 's', "SRP authentication for 'user'"}, - {"srppass", OPT_SRPPASS, 's', "Password for 'user'"}, - {"srp_lateuser", OPT_SRP_LATEUSER, '-', - "SRP username into second ClientHello message"}, - {"srp_moregroups", OPT_SRP_MOREGROUPS, '-', - "Tolerate other than the known g N values."}, - {"srp_strength", OPT_SRP_STRENGTH, 'p', "Minimal length in bits for N"}, -#endif -#ifndef OPENSSL_NO_NEXTPROTONEG - {"nextprotoneg", OPT_NEXTPROTONEG, 's', - "Enable NPN extension, considering named protocols supported (comma-separated list)"}, -#endif -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, - {"ssl_client_engine", OPT_SSL_CLIENT_ENGINE, 's', - "Specify engine to be used for client certificate operations"}, -#endif -#ifndef OPENSSL_NO_CT - {"ct", OPT_CT, '-', "Request and parse SCTs (also enables OCSP stapling)"}, - {"noct", OPT_NOCT, '-', "Do not request or parse SCTs (default)"}, - {"ctlogfile", OPT_CTLOG_FILE, '<', "CT log list CONF file"}, -#endif - {"keylogfile", OPT_KEYLOG_FILE, '>', "Write TLS secrets to file"}, - {"early_data", OPT_EARLY_DATA, '<', "File to send as early data"}, - {"enable_pha", OPT_ENABLE_PHA, '-', "Enable post-handshake-authentication"}, - {NULL, OPT_EOF, 0x00, NULL} -}; - -typedef enum PROTOCOL_choice { - PROTO_OFF, - PROTO_SMTP, - PROTO_POP3, - PROTO_IMAP, - PROTO_FTP, - PROTO_TELNET, - PROTO_XMPP, - PROTO_XMPP_SERVER, - PROTO_CONNECT, - PROTO_IRC, - PROTO_MYSQL, - PROTO_POSTGRES, - PROTO_LMTP, - PROTO_NNTP, - PROTO_SIEVE, - PROTO_LDAP -} PROTOCOL_CHOICE; - -static const OPT_PAIR services[] = { - {"smtp", PROTO_SMTP}, - {"pop3", PROTO_POP3}, - {"imap", PROTO_IMAP}, - {"ftp", PROTO_FTP}, - {"xmpp", PROTO_XMPP}, - {"xmpp-server", PROTO_XMPP_SERVER}, - {"telnet", PROTO_TELNET}, - {"irc", PROTO_IRC}, - {"mysql", PROTO_MYSQL}, - {"postgres", PROTO_POSTGRES}, - {"lmtp", PROTO_LMTP}, - {"nntp", PROTO_NNTP}, - {"sieve", PROTO_SIEVE}, - {"ldap", PROTO_LDAP}, - {NULL, 0} -}; - -#define IS_INET_FLAG(o) \ - (o == OPT_4 || o == OPT_6 || o == OPT_HOST || o == OPT_PORT || o == OPT_CONNECT) -#define IS_UNIX_FLAG(o) (o == OPT_UNIX) - -#define IS_PROT_FLAG(o) \ - (o == OPT_SSL3 || o == OPT_TLS1 || o == OPT_TLS1_1 || o == OPT_TLS1_2 \ - || o == OPT_TLS1_3 || o == OPT_DTLS || o == OPT_DTLS1 || o == OPT_DTLS1_2) - -/* Free |*dest| and optionally set it to a copy of |source|. */ -static void freeandcopy(char **dest, const char *source) -{ - OPENSSL_free(*dest); - *dest = NULL; - if (source != NULL) - *dest = OPENSSL_strdup(source); -} - -static int new_session_cb(SSL *s, SSL_SESSION *sess) -{ - - if (sess_out != NULL) { - BIO *stmp = BIO_new_file(sess_out, "w"); - - if (stmp == NULL) { - BIO_printf(bio_err, "Error writing session file %s\n", sess_out); - } else { - PEM_write_bio_SSL_SESSION(stmp, sess); - BIO_free(stmp); - } - } - - /* - * Session data gets dumped on connection for TLSv1.2 and below, and on - * arrival of the NewSessionTicket for TLSv1.3. - */ - if (SSL_version(s) == TLS1_3_VERSION) { - BIO_printf(bio_c_out, - "---\nPost-Handshake New Session Ticket arrived:\n"); - SSL_SESSION_print(bio_c_out, sess); - BIO_printf(bio_c_out, "---\n"); - } - - /* - * We always return a "fail" response so that the session gets freed again - * because we haven't used the reference. - */ - return 0; -} - -int s_client_main(int argc, char **argv) -{ - BIO *sbio; - EVP_PKEY *key = NULL; - SSL *con = NULL; - SSL_CTX *ctx = NULL; - STACK_OF(X509) *chain = NULL; - X509 *cert = NULL; - X509_VERIFY_PARAM *vpm = NULL; - SSL_EXCERT *exc = NULL; - SSL_CONF_CTX *cctx = NULL; - STACK_OF(OPENSSL_STRING) *ssl_args = NULL; - char *dane_tlsa_domain = NULL; - STACK_OF(OPENSSL_STRING) *dane_tlsa_rrset = NULL; - int dane_ee_no_name = 0; - STACK_OF(X509_CRL) *crls = NULL; - const SSL_METHOD *meth = TLS_client_method(); - const char *CApath = NULL, *CAfile = NULL; - char *cbuf = NULL, *sbuf = NULL; - char *mbuf = NULL, *proxystr = NULL, *connectstr = NULL, *bindstr = NULL; - char *cert_file = NULL, *key_file = NULL, *chain_file = NULL; - char *chCApath = NULL, *chCAfile = NULL, *host = NULL; - char *port = OPENSSL_strdup(PORT); - char *bindhost = NULL, *bindport = NULL; - char *passarg = NULL, *pass = NULL, *vfyCApath = NULL, *vfyCAfile = NULL; - char *ReqCAfile = NULL; - char *sess_in = NULL, *crl_file = NULL, *p; - const char *protohost = NULL; - struct timeval timeout, *timeoutp; - fd_set readfds, writefds; - int noCApath = 0, noCAfile = 0; - int build_chain = 0, cbuf_len, cbuf_off, cert_format = FORMAT_PEM; - int key_format = FORMAT_PEM, crlf = 0, full_log = 1, mbuf_len = 0; - int prexit = 0; - int sdebug = 0; - int reconnect = 0, verify = SSL_VERIFY_NONE, vpmtouched = 0; - int ret = 1, in_init = 1, i, nbio_test = 0, s = -1, k, width, state = 0; - int sbuf_len, sbuf_off, cmdletters = 1; - int socket_family = AF_UNSPEC, socket_type = SOCK_STREAM, protocol = 0; - int starttls_proto = PROTO_OFF, crl_format = FORMAT_PEM, crl_download = 0; - int write_tty, read_tty, write_ssl, read_ssl, tty_on, ssl_pending; -#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) - int at_eof = 0; -#endif - int read_buf_len = 0; - int fallback_scsv = 0; - OPTION_CHOICE o; -#ifndef OPENSSL_NO_DTLS - int enable_timeouts = 0; - long socket_mtu = 0; -#endif -#ifndef OPENSSL_NO_ENGINE - ENGINE *ssl_client_engine = NULL; -#endif - ENGINE *e = NULL; -#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) - struct timeval tv; -#endif - const char *servername = NULL; - int noservername = 0; - const char *alpn_in = NULL; - tlsextctx tlsextcbp = { NULL, 0 }; - const char *ssl_config = NULL; -#define MAX_SI_TYPES 100 - unsigned short serverinfo_types[MAX_SI_TYPES]; - int serverinfo_count = 0, start = 0, len; -#ifndef OPENSSL_NO_NEXTPROTONEG - const char *next_proto_neg_in = NULL; -#endif -#ifndef OPENSSL_NO_SRP - char *srppass = NULL; - int srp_lateuser = 0; - SRP_ARG srp_arg = { NULL, NULL, 0, 0, 0, 1024 }; -#endif -#ifndef OPENSSL_NO_SRTP - char *srtp_profiles = NULL; -#endif -#ifndef OPENSSL_NO_CT - char *ctlog_file = NULL; - int ct_validation = 0; -#endif - int min_version = 0, max_version = 0, prot_opt = 0, no_prot_opt = 0; - int async = 0; - unsigned int max_send_fragment = 0; - unsigned int split_send_fragment = 0, max_pipelines = 0; - enum { use_inet, use_unix, use_unknown } connect_type = use_unknown; - int count4or6 = 0; - uint8_t maxfraglen = 0; - int c_nbio = 0, c_msg = 0, c_ign_eof = 0, c_brief = 0; - int c_tlsextdebug = 0; -#ifndef OPENSSL_NO_OCSP - int c_status_req = 0; -#endif - BIO *bio_c_msg = NULL; - const char *keylog_file = NULL, *early_data_file = NULL; -#ifndef OPENSSL_NO_DTLS - int isdtls = 0; -#endif - char *psksessf = NULL; - int enable_pha = 0; -#ifndef OPENSSL_NO_SCTP - int sctp_label_bug = 0; -#endif - - FD_ZERO(&readfds); - FD_ZERO(&writefds); -/* Known false-positive of MemorySanitizer. */ -#if defined(__has_feature) -# if __has_feature(memory_sanitizer) - __msan_unpoison(&readfds, sizeof(readfds)); - __msan_unpoison(&writefds, sizeof(writefds)); -# endif -#endif - - prog = opt_progname(argv[0]); - c_quiet = 0; - c_debug = 0; - c_showcerts = 0; - c_nbio = 0; - vpm = X509_VERIFY_PARAM_new(); - cctx = SSL_CONF_CTX_new(); - - if (vpm == NULL || cctx == NULL) { - BIO_printf(bio_err, "%s: out of memory\n", prog); - goto end; - } - - cbuf = app_malloc(BUFSIZZ, "cbuf"); - sbuf = app_malloc(BUFSIZZ, "sbuf"); - mbuf = app_malloc(BUFSIZZ, "mbuf"); - - SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT | SSL_CONF_FLAG_CMDLINE); - - prog = opt_init(argc, argv, s_client_options); - while ((o = opt_next()) != OPT_EOF) { - /* Check for intermixing flags. */ - if (connect_type == use_unix && IS_INET_FLAG(o)) { - BIO_printf(bio_err, - "%s: Intermixed protocol flags (unix and internet domains)\n", - prog); - goto end; - } - if (connect_type == use_inet && IS_UNIX_FLAG(o)) { - BIO_printf(bio_err, - "%s: Intermixed protocol flags (internet and unix domains)\n", - prog); - goto end; - } - - if (IS_PROT_FLAG(o) && ++prot_opt > 1) { - BIO_printf(bio_err, "Cannot supply multiple protocol flags\n"); - goto end; - } - if (IS_NO_PROT_FLAG(o)) - no_prot_opt++; - if (prot_opt == 1 && no_prot_opt) { - BIO_printf(bio_err, - "Cannot supply both a protocol flag and '-no_<prot>'\n"); - goto end; - } - - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(s_client_options); - ret = 0; - goto end; - case OPT_4: - connect_type = use_inet; - socket_family = AF_INET; - count4or6++; - break; -#ifdef AF_INET6 - case OPT_6: - connect_type = use_inet; - socket_family = AF_INET6; - count4or6++; - break; -#endif - case OPT_HOST: - connect_type = use_inet; - freeandcopy(&host, opt_arg()); - break; - case OPT_PORT: - connect_type = use_inet; - freeandcopy(&port, opt_arg()); - break; - case OPT_CONNECT: - connect_type = use_inet; - freeandcopy(&connectstr, opt_arg()); - break; - case OPT_BIND: - freeandcopy(&bindstr, opt_arg()); - break; - case OPT_PROXY: - proxystr = opt_arg(); - starttls_proto = PROTO_CONNECT; - break; -#ifdef AF_UNIX - case OPT_UNIX: - connect_type = use_unix; - socket_family = AF_UNIX; - freeandcopy(&host, opt_arg()); - break; -#endif - case OPT_XMPPHOST: - /* fall through, since this is an alias */ - case OPT_PROTOHOST: - protohost = opt_arg(); - break; - case OPT_VERIFY: - verify = SSL_VERIFY_PEER; - verify_args.depth = atoi(opt_arg()); - if (!c_quiet) - BIO_printf(bio_err, "verify depth is %d\n", verify_args.depth); - break; - case OPT_CERT: - cert_file = opt_arg(); - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto end; - break; - case OPT_CRL: - crl_file = opt_arg(); - break; - case OPT_CRL_DOWNLOAD: - crl_download = 1; - break; - case OPT_SESS_OUT: - sess_out = opt_arg(); - break; - case OPT_SESS_IN: - sess_in = opt_arg(); - break; - case OPT_CERTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &cert_format)) - goto opthelp; - break; - case OPT_CRLFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &crl_format)) - goto opthelp; - break; - case OPT_VERIFY_RET_ERROR: - verify = SSL_VERIFY_PEER; - verify_args.return_error = 1; - break; - case OPT_VERIFY_QUIET: - verify_args.quiet = 1; - break; - case OPT_BRIEF: - c_brief = verify_args.quiet = c_quiet = 1; - break; - case OPT_S_CASES: - if (ssl_args == NULL) - ssl_args = sk_OPENSSL_STRING_new_null(); - if (ssl_args == NULL - || !sk_OPENSSL_STRING_push(ssl_args, opt_flag()) - || !sk_OPENSSL_STRING_push(ssl_args, opt_arg())) { - BIO_printf(bio_err, "%s: Memory allocation failure\n", prog); - goto end; - } - break; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto end; - vpmtouched++; - break; - case OPT_X_CASES: - if (!args_excert(o, &exc)) - goto end; - break; - case OPT_PREXIT: - prexit = 1; - break; - case OPT_CRLF: - crlf = 1; - break; - case OPT_QUIET: - c_quiet = c_ign_eof = 1; - break; - case OPT_NBIO: - c_nbio = 1; - break; - case OPT_NOCMDS: - cmdletters = 0; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 1); - break; - case OPT_SSL_CLIENT_ENGINE: -#ifndef OPENSSL_NO_ENGINE - ssl_client_engine = ENGINE_by_id(opt_arg()); - if (ssl_client_engine == NULL) { - BIO_printf(bio_err, "Error getting client auth engine\n"); - goto opthelp; - } -#endif - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_IGN_EOF: - c_ign_eof = 1; - break; - case OPT_NO_IGN_EOF: - c_ign_eof = 0; - break; - case OPT_DEBUG: - c_debug = 1; - break; - case OPT_TLSEXTDEBUG: - c_tlsextdebug = 1; - break; - case OPT_STATUS: -#ifndef OPENSSL_NO_OCSP - c_status_req = 1; -#endif - break; - case OPT_WDEBUG: -#ifdef WATT32 - dbug_init(); -#endif - break; - case OPT_MSG: - c_msg = 1; - break; - case OPT_MSGFILE: - bio_c_msg = BIO_new_file(opt_arg(), "w"); - break; - case OPT_TRACE: -#ifndef OPENSSL_NO_SSL_TRACE - c_msg = 2; -#endif - break; - case OPT_SECURITY_DEBUG: - sdebug = 1; - break; - case OPT_SECURITY_DEBUG_VERBOSE: - sdebug = 2; - break; - case OPT_SHOWCERTS: - c_showcerts = 1; - break; - case OPT_NBIO_TEST: - nbio_test = 1; - break; - case OPT_STATE: - state = 1; - break; - case OPT_PSK_IDENTITY: - psk_identity = opt_arg(); - break; - case OPT_PSK: - for (p = psk_key = opt_arg(); *p; p++) { - if (isxdigit(_UC(*p))) - continue; - BIO_printf(bio_err, "Not a hex number '%s'\n", psk_key); - goto end; - } - break; - case OPT_PSK_SESS: - psksessf = opt_arg(); - break; -#ifndef OPENSSL_NO_SRP - case OPT_SRPUSER: - srp_arg.srplogin = opt_arg(); - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; - break; - case OPT_SRPPASS: - srppass = opt_arg(); - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; - break; - case OPT_SRP_STRENGTH: - srp_arg.strength = atoi(opt_arg()); - BIO_printf(bio_err, "SRP minimal length for N is %d\n", - srp_arg.strength); - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; - break; - case OPT_SRP_LATEUSER: - srp_lateuser = 1; - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; - break; - case OPT_SRP_MOREGROUPS: - srp_arg.amp = 1; - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; - break; -#endif - case OPT_SSL_CONFIG: - ssl_config = opt_arg(); - break; - case OPT_SSL3: - min_version = SSL3_VERSION; - max_version = SSL3_VERSION; - socket_type = SOCK_STREAM; -#ifndef OPENSSL_NO_DTLS - isdtls = 0; -#endif - break; - case OPT_TLS1_3: - min_version = TLS1_3_VERSION; - max_version = TLS1_3_VERSION; - socket_type = SOCK_STREAM; -#ifndef OPENSSL_NO_DTLS - isdtls = 0; -#endif - break; - case OPT_TLS1_2: - min_version = TLS1_2_VERSION; - max_version = TLS1_2_VERSION; - socket_type = SOCK_STREAM; -#ifndef OPENSSL_NO_DTLS - isdtls = 0; -#endif - break; - case OPT_TLS1_1: - min_version = TLS1_1_VERSION; - max_version = TLS1_1_VERSION; - socket_type = SOCK_STREAM; -#ifndef OPENSSL_NO_DTLS - isdtls = 0; -#endif - break; - case OPT_TLS1: - min_version = TLS1_VERSION; - max_version = TLS1_VERSION; - socket_type = SOCK_STREAM; -#ifndef OPENSSL_NO_DTLS - isdtls = 0; -#endif - break; - case OPT_DTLS: -#ifndef OPENSSL_NO_DTLS - meth = DTLS_client_method(); - socket_type = SOCK_DGRAM; - isdtls = 1; -#endif - break; - case OPT_DTLS1: -#ifndef OPENSSL_NO_DTLS1 - meth = DTLS_client_method(); - min_version = DTLS1_VERSION; - max_version = DTLS1_VERSION; - socket_type = SOCK_DGRAM; - isdtls = 1; -#endif - break; - case OPT_DTLS1_2: -#ifndef OPENSSL_NO_DTLS1_2 - meth = DTLS_client_method(); - min_version = DTLS1_2_VERSION; - max_version = DTLS1_2_VERSION; - socket_type = SOCK_DGRAM; - isdtls = 1; -#endif - break; - case OPT_SCTP: -#ifndef OPENSSL_NO_SCTP - protocol = IPPROTO_SCTP; -#endif - break; - case OPT_SCTP_LABEL_BUG: -#ifndef OPENSSL_NO_SCTP - sctp_label_bug = 1; -#endif - break; - case OPT_TIMEOUT: -#ifndef OPENSSL_NO_DTLS - enable_timeouts = 1; -#endif - break; - case OPT_MTU: -#ifndef OPENSSL_NO_DTLS - socket_mtu = atol(opt_arg()); -#endif - break; - case OPT_FALLBACKSCSV: - fallback_scsv = 1; - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDE, &key_format)) - goto opthelp; - break; - case OPT_PASS: - passarg = opt_arg(); - break; - case OPT_CERT_CHAIN: - chain_file = opt_arg(); - break; - case OPT_KEY: - key_file = opt_arg(); - break; - case OPT_RECONNECT: - reconnect = 5; - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_CHAINCAPATH: - chCApath = opt_arg(); - break; - case OPT_VERIFYCAPATH: - vfyCApath = opt_arg(); - break; - case OPT_BUILD_CHAIN: - build_chain = 1; - break; - case OPT_REQCAFILE: - ReqCAfile = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; -#ifndef OPENSSL_NO_CT - case OPT_NOCT: - ct_validation = 0; - break; - case OPT_CT: - ct_validation = 1; - break; - case OPT_CTLOG_FILE: - ctlog_file = opt_arg(); - break; -#endif - case OPT_CHAINCAFILE: - chCAfile = opt_arg(); - break; - case OPT_VERIFYCAFILE: - vfyCAfile = opt_arg(); - break; - case OPT_DANE_TLSA_DOMAIN: - dane_tlsa_domain = opt_arg(); - break; - case OPT_DANE_TLSA_RRDATA: - if (dane_tlsa_rrset == NULL) - dane_tlsa_rrset = sk_OPENSSL_STRING_new_null(); - if (dane_tlsa_rrset == NULL || - !sk_OPENSSL_STRING_push(dane_tlsa_rrset, opt_arg())) { - BIO_printf(bio_err, "%s: Memory allocation failure\n", prog); - goto end; - } - break; - case OPT_DANE_EE_NO_NAME: - dane_ee_no_name = 1; - break; - case OPT_NEXTPROTONEG: -#ifndef OPENSSL_NO_NEXTPROTONEG - next_proto_neg_in = opt_arg(); -#endif - break; - case OPT_ALPN: - alpn_in = opt_arg(); - break; - case OPT_SERVERINFO: - p = opt_arg(); - len = strlen(p); - for (start = 0, i = 0; i <= len; ++i) { - if (i == len || p[i] == ',') { - serverinfo_types[serverinfo_count] = atoi(p + start); - if (++serverinfo_count == MAX_SI_TYPES) - break; - start = i + 1; - } - } - break; - case OPT_STARTTLS: - if (!opt_pair(opt_arg(), services, &starttls_proto)) - goto end; - break; - case OPT_SERVERNAME: - servername = opt_arg(); - break; - case OPT_NOSERVERNAME: - noservername = 1; - break; - case OPT_USE_SRTP: -#ifndef OPENSSL_NO_SRTP - srtp_profiles = opt_arg(); -#endif - break; - case OPT_KEYMATEXPORT: - keymatexportlabel = opt_arg(); - break; - case OPT_KEYMATEXPORTLEN: - keymatexportlen = atoi(opt_arg()); - break; - case OPT_ASYNC: - async = 1; - break; - case OPT_MAXFRAGLEN: - len = atoi(opt_arg()); - switch (len) { - case 512: - maxfraglen = TLSEXT_max_fragment_length_512; - break; - case 1024: - maxfraglen = TLSEXT_max_fragment_length_1024; - break; - case 2048: - maxfraglen = TLSEXT_max_fragment_length_2048; - break; - case 4096: - maxfraglen = TLSEXT_max_fragment_length_4096; - break; - default: - BIO_printf(bio_err, - "%s: Max Fragment Len %u is out of permitted values", - prog, len); - goto opthelp; - } - break; - case OPT_MAX_SEND_FRAG: - max_send_fragment = atoi(opt_arg()); - break; - case OPT_SPLIT_SEND_FRAG: - split_send_fragment = atoi(opt_arg()); - break; - case OPT_MAX_PIPELINES: - max_pipelines = atoi(opt_arg()); - break; - case OPT_READ_BUF: - read_buf_len = atoi(opt_arg()); - break; - case OPT_KEYLOG_FILE: - keylog_file = opt_arg(); - break; - case OPT_EARLY_DATA: - early_data_file = opt_arg(); - break; - case OPT_ENABLE_PHA: - enable_pha = 1; - break; - } - } - if (count4or6 >= 2) { - BIO_printf(bio_err, "%s: Can't use both -4 and -6\n", prog); - goto opthelp; - } - if (noservername) { - if (servername != NULL) { - BIO_printf(bio_err, - "%s: Can't use -servername and -noservername together\n", - prog); - goto opthelp; - } - if (dane_tlsa_domain != NULL) { - BIO_printf(bio_err, - "%s: Can't use -dane_tlsa_domain and -noservername together\n", - prog); - goto opthelp; - } - } - argc = opt_num_rest(); - if (argc == 1) { - /* If there's a positional argument, it's the equivalent of - * OPT_CONNECT. - * Don't allow -connect and a separate argument. - */ - if (connectstr != NULL) { - BIO_printf(bio_err, - "%s: must not provide both -connect option and target parameter\n", - prog); - goto opthelp; - } - connect_type = use_inet; - freeandcopy(&connectstr, *opt_rest()); - } else if (argc != 0) { - goto opthelp; - } - -#ifndef OPENSSL_NO_NEXTPROTONEG - if (min_version == TLS1_3_VERSION && next_proto_neg_in != NULL) { - BIO_printf(bio_err, "Cannot supply -nextprotoneg with TLSv1.3\n"); - goto opthelp; - } -#endif - if (proxystr != NULL) { - int res; - char *tmp_host = host, *tmp_port = port; - if (connectstr == NULL) { - BIO_printf(bio_err, "%s: -proxy requires use of -connect or target parameter\n", prog); - goto opthelp; - } - res = BIO_parse_hostserv(proxystr, &host, &port, BIO_PARSE_PRIO_HOST); - if (tmp_host != host) - OPENSSL_free(tmp_host); - if (tmp_port != port) - OPENSSL_free(tmp_port); - if (!res) { - BIO_printf(bio_err, - "%s: -proxy argument malformed or ambiguous\n", prog); - goto end; - } - } else { - int res = 1; - char *tmp_host = host, *tmp_port = port; - if (connectstr != NULL) - res = BIO_parse_hostserv(connectstr, &host, &port, - BIO_PARSE_PRIO_HOST); - if (tmp_host != host) - OPENSSL_free(tmp_host); - if (tmp_port != port) - OPENSSL_free(tmp_port); - if (!res) { - BIO_printf(bio_err, - "%s: -connect argument or target parameter malformed or ambiguous\n", - prog); - goto end; - } - } - - if (bindstr != NULL) { - int res; - res = BIO_parse_hostserv(bindstr, &bindhost, &bindport, - BIO_PARSE_PRIO_HOST); - if (!res) { - BIO_printf(bio_err, - "%s: -bind argument parameter malformed or ambiguous\n", - prog); - goto end; - } - } - -#ifdef AF_UNIX - if (socket_family == AF_UNIX && socket_type != SOCK_STREAM) { - BIO_printf(bio_err, - "Can't use unix sockets and datagrams together\n"); - goto end; - } -#endif - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP) { - if (socket_type != SOCK_DGRAM) { - BIO_printf(bio_err, "Can't use -sctp without DTLS\n"); - goto end; - } - /* SCTP is unusual. It uses DTLS over a SOCK_STREAM protocol */ - socket_type = SOCK_STREAM; - } -#endif - -#if !defined(OPENSSL_NO_NEXTPROTONEG) - next_proto.status = -1; - if (next_proto_neg_in) { - next_proto.data = - next_protos_parse(&next_proto.len, next_proto_neg_in); - if (next_proto.data == NULL) { - BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n"); - goto end; - } - } else - next_proto.data = NULL; -#endif - - if (!app_passwd(passarg, NULL, &pass, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - if (key_file == NULL) - key_file = cert_file; - - if (key_file != NULL) { - key = load_key(key_file, key_format, 0, pass, e, - "client certificate private key file"); - if (key == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (cert_file != NULL) { - cert = load_cert(cert_file, cert_format, "client certificate file"); - if (cert == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (chain_file != NULL) { - if (!load_certs(chain_file, &chain, FORMAT_PEM, NULL, - "client certificate chain")) - goto end; - } - - if (crl_file != NULL) { - X509_CRL *crl; - crl = load_crl(crl_file, crl_format); - if (crl == NULL) { - BIO_puts(bio_err, "Error loading CRL\n"); - ERR_print_errors(bio_err); - goto end; - } - crls = sk_X509_CRL_new_null(); - if (crls == NULL || !sk_X509_CRL_push(crls, crl)) { - BIO_puts(bio_err, "Error adding CRL\n"); - ERR_print_errors(bio_err); - X509_CRL_free(crl); - goto end; - } - } - - if (!load_excert(&exc)) - goto end; - - if (bio_c_out == NULL) { - if (c_quiet && !c_debug) { - bio_c_out = BIO_new(BIO_s_null()); - if (c_msg && bio_c_msg == NULL) - bio_c_msg = dup_bio_out(FORMAT_TEXT); - } else if (bio_c_out == NULL) - bio_c_out = dup_bio_out(FORMAT_TEXT); - } -#ifndef OPENSSL_NO_SRP - if (!app_passwd(srppass, NULL, &srp_arg.srppassin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } -#endif - - ctx = SSL_CTX_new(meth); - if (ctx == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY); - - if (sdebug) - ssl_ctx_security_debug(ctx, sdebug); - - if (!config_ctx(cctx, ssl_args, ctx)) - goto end; - - if (ssl_config != NULL) { - if (SSL_CTX_config(ctx, ssl_config) == 0) { - BIO_printf(bio_err, "Error using configuration \"%s\"\n", - ssl_config); - ERR_print_errors(bio_err); - goto end; - } - } - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP && sctp_label_bug == 1) - SSL_CTX_set_mode(ctx, SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG); -#endif - - if (min_version != 0 - && SSL_CTX_set_min_proto_version(ctx, min_version) == 0) - goto end; - if (max_version != 0 - && SSL_CTX_set_max_proto_version(ctx, max_version) == 0) - goto end; - - if (vpmtouched && !SSL_CTX_set1_param(ctx, vpm)) { - BIO_printf(bio_err, "Error setting verify params\n"); - ERR_print_errors(bio_err); - goto end; - } - - if (async) { - SSL_CTX_set_mode(ctx, SSL_MODE_ASYNC); - } - - if (max_send_fragment > 0 - && !SSL_CTX_set_max_send_fragment(ctx, max_send_fragment)) { - BIO_printf(bio_err, "%s: Max send fragment size %u is out of permitted range\n", - prog, max_send_fragment); - goto end; - } - - if (split_send_fragment > 0 - && !SSL_CTX_set_split_send_fragment(ctx, split_send_fragment)) { - BIO_printf(bio_err, "%s: Split send fragment size %u is out of permitted range\n", - prog, split_send_fragment); - goto end; - } - - if (max_pipelines > 0 - && !SSL_CTX_set_max_pipelines(ctx, max_pipelines)) { - BIO_printf(bio_err, "%s: Max pipelines %u is out of permitted range\n", - prog, max_pipelines); - goto end; - } - - if (read_buf_len > 0) { - SSL_CTX_set_default_read_buffer_len(ctx, read_buf_len); - } - - if (maxfraglen > 0 - && !SSL_CTX_set_tlsext_max_fragment_length(ctx, maxfraglen)) { - BIO_printf(bio_err, - "%s: Max Fragment Length code %u is out of permitted values" - "\n", prog, maxfraglen); - goto end; - } - - if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile, - crls, crl_download)) { - BIO_printf(bio_err, "Error loading store locations\n"); - ERR_print_errors(bio_err); - goto end; - } - if (ReqCAfile != NULL) { - STACK_OF(X509_NAME) *nm = sk_X509_NAME_new_null(); - - if (nm == NULL || !SSL_add_file_cert_subjects_to_stack(nm, ReqCAfile)) { - sk_X509_NAME_pop_free(nm, X509_NAME_free); - BIO_printf(bio_err, "Error loading CA names\n"); - ERR_print_errors(bio_err); - goto end; - } - SSL_CTX_set0_CA_list(ctx, nm); - } -#ifndef OPENSSL_NO_ENGINE - if (ssl_client_engine) { - if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine)) { - BIO_puts(bio_err, "Error setting client auth engine\n"); - ERR_print_errors(bio_err); - ENGINE_free(ssl_client_engine); - goto end; - } - ENGINE_free(ssl_client_engine); - } -#endif - -#ifndef OPENSSL_NO_PSK - if (psk_key != NULL) { - if (c_debug) - BIO_printf(bio_c_out, "PSK key given, setting client callback\n"); - SSL_CTX_set_psk_client_callback(ctx, psk_client_cb); - } -#endif - if (psksessf != NULL) { - BIO *stmp = BIO_new_file(psksessf, "r"); - - if (stmp == NULL) { - BIO_printf(bio_err, "Can't open PSK session file %s\n", psksessf); - ERR_print_errors(bio_err); - goto end; - } - psksess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL); - BIO_free(stmp); - if (psksess == NULL) { - BIO_printf(bio_err, "Can't read PSK session file %s\n", psksessf); - ERR_print_errors(bio_err); - goto end; - } - } - if (psk_key != NULL || psksess != NULL) - SSL_CTX_set_psk_use_session_callback(ctx, psk_use_session_cb); - -#ifndef OPENSSL_NO_SRTP - if (srtp_profiles != NULL) { - /* Returns 0 on success! */ - if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles) != 0) { - BIO_printf(bio_err, "Error setting SRTP profile\n"); - ERR_print_errors(bio_err); - goto end; - } - } -#endif - - if (exc != NULL) - ssl_ctx_set_excert(ctx, exc); - -#if !defined(OPENSSL_NO_NEXTPROTONEG) - if (next_proto.data != NULL) - SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto); -#endif - if (alpn_in) { - size_t alpn_len; - unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in); - - if (alpn == NULL) { - BIO_printf(bio_err, "Error parsing -alpn argument\n"); - goto end; - } - /* Returns 0 on success! */ - if (SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len) != 0) { - BIO_printf(bio_err, "Error setting ALPN\n"); - goto end; - } - OPENSSL_free(alpn); - } - - for (i = 0; i < serverinfo_count; i++) { - if (!SSL_CTX_add_client_custom_ext(ctx, - serverinfo_types[i], - NULL, NULL, NULL, - serverinfo_cli_parse_cb, NULL)) { - BIO_printf(bio_err, - "Warning: Unable to add custom extension %u, skipping\n", - serverinfo_types[i]); - } - } - - if (state) - SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback); - -#ifndef OPENSSL_NO_CT - /* Enable SCT processing, without early connection termination */ - if (ct_validation && - !SSL_CTX_enable_ct(ctx, SSL_CT_VALIDATION_PERMISSIVE)) { - ERR_print_errors(bio_err); - goto end; - } - - if (!ctx_set_ctlog_list_file(ctx, ctlog_file)) { - if (ct_validation) { - ERR_print_errors(bio_err); - goto end; - } - - /* - * If CT validation is not enabled, the log list isn't needed so don't - * show errors or abort. We try to load it regardless because then we - * can show the names of the logs any SCTs came from (SCTs may be seen - * even with validation disabled). - */ - ERR_clear_error(); - } -#endif - - SSL_CTX_set_verify(ctx, verify, verify_callback); - - if (!ctx_set_verify_locations(ctx, CAfile, CApath, noCAfile, noCApath)) { - ERR_print_errors(bio_err); - goto end; - } - - ssl_ctx_add_crls(ctx, crls, crl_download); - - if (!set_cert_key_stuff(ctx, cert, key, chain, build_chain)) - goto end; - - if (!noservername) { - tlsextcbp.biodebug = bio_err; - SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb); - SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp); - } -# ifndef OPENSSL_NO_SRP - if (srp_arg.srplogin) { - if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin)) { - BIO_printf(bio_err, "Unable to set SRP username\n"); - goto end; - } - srp_arg.msg = c_msg; - srp_arg.debug = c_debug; - SSL_CTX_set_srp_cb_arg(ctx, &srp_arg); - SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb); - SSL_CTX_set_srp_strength(ctx, srp_arg.strength); - if (c_msg || c_debug || srp_arg.amp == 0) - SSL_CTX_set_srp_verify_param_callback(ctx, - ssl_srp_verify_param_cb); - } -# endif - - if (dane_tlsa_domain != NULL) { - if (SSL_CTX_dane_enable(ctx) <= 0) { - BIO_printf(bio_err, - "%s: Error enabling DANE TLSA authentication.\n", - prog); - ERR_print_errors(bio_err); - goto end; - } - } - - /* - * In TLSv1.3 NewSessionTicket messages arrive after the handshake and can - * come at any time. Therefore we use a callback to write out the session - * when we know about it. This approach works for < TLSv1.3 as well. - */ - SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT - | SSL_SESS_CACHE_NO_INTERNAL_STORE); - SSL_CTX_sess_set_new_cb(ctx, new_session_cb); - - if (set_keylog_file(ctx, keylog_file)) - goto end; - - con = SSL_new(ctx); - if (con == NULL) - goto end; - - if (enable_pha) - SSL_set_post_handshake_auth(con, 1); - - if (sess_in != NULL) { - SSL_SESSION *sess; - BIO *stmp = BIO_new_file(sess_in, "r"); - if (stmp == NULL) { - BIO_printf(bio_err, "Can't open session file %s\n", sess_in); - ERR_print_errors(bio_err); - goto end; - } - sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL); - BIO_free(stmp); - if (sess == NULL) { - BIO_printf(bio_err, "Can't open session file %s\n", sess_in); - ERR_print_errors(bio_err); - goto end; - } - if (!SSL_set_session(con, sess)) { - BIO_printf(bio_err, "Can't set session\n"); - ERR_print_errors(bio_err); - goto end; - } - - SSL_SESSION_free(sess); - } - - if (fallback_scsv) - SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV); - - if (!noservername && (servername != NULL || dane_tlsa_domain == NULL)) { - if (servername == NULL) { - if(host == NULL || is_dNS_name(host)) - servername = (host == NULL) ? "localhost" : host; - } - if (servername != NULL && !SSL_set_tlsext_host_name(con, servername)) { - BIO_printf(bio_err, "Unable to set TLS servername extension.\n"); - ERR_print_errors(bio_err); - goto end; - } - } - - if (dane_tlsa_domain != NULL) { - if (SSL_dane_enable(con, dane_tlsa_domain) <= 0) { - BIO_printf(bio_err, "%s: Error enabling DANE TLSA " - "authentication.\n", prog); - ERR_print_errors(bio_err); - goto end; - } - if (dane_tlsa_rrset == NULL) { - BIO_printf(bio_err, "%s: DANE TLSA authentication requires at " - "least one -dane_tlsa_rrdata option.\n", prog); - goto end; - } - if (tlsa_import_rrset(con, dane_tlsa_rrset) <= 0) { - BIO_printf(bio_err, "%s: Failed to import any TLSA " - "records.\n", prog); - goto end; - } - if (dane_ee_no_name) - SSL_dane_set_flags(con, DANE_FLAG_NO_DANE_EE_NAMECHECKS); - } else if (dane_tlsa_rrset != NULL) { - BIO_printf(bio_err, "%s: DANE TLSA authentication requires the " - "-dane_tlsa_domain option.\n", prog); - goto end; - } - - re_start: - if (init_client(&s, host, port, bindhost, bindport, socket_family, - socket_type, protocol) == 0) { - BIO_printf(bio_err, "connect:errno=%d\n", get_last_socket_error()); - BIO_closesocket(s); - goto end; - } - BIO_printf(bio_c_out, "CONNECTED(%08X)\n", s); - - if (c_nbio) { - if (!BIO_socket_nbio(s, 1)) { - ERR_print_errors(bio_err); - goto end; - } - BIO_printf(bio_c_out, "Turned on non blocking io\n"); - } -#ifndef OPENSSL_NO_DTLS - if (isdtls) { - union BIO_sock_info_u peer_info; - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP) - sbio = BIO_new_dgram_sctp(s, BIO_NOCLOSE); - else -#endif - sbio = BIO_new_dgram(s, BIO_NOCLOSE); - - if ((peer_info.addr = BIO_ADDR_new()) == NULL) { - BIO_printf(bio_err, "memory allocation failure\n"); - BIO_closesocket(s); - goto end; - } - if (!BIO_sock_info(s, BIO_SOCK_INFO_ADDRESS, &peer_info)) { - BIO_printf(bio_err, "getsockname:errno=%d\n", - get_last_socket_error()); - BIO_ADDR_free(peer_info.addr); - BIO_closesocket(s); - goto end; - } - - (void)BIO_ctrl_set_connected(sbio, peer_info.addr); - BIO_ADDR_free(peer_info.addr); - peer_info.addr = NULL; - - if (enable_timeouts) { - timeout.tv_sec = 0; - timeout.tv_usec = DGRAM_RCV_TIMEOUT; - BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout); - - timeout.tv_sec = 0; - timeout.tv_usec = DGRAM_SND_TIMEOUT; - BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout); - } - - if (socket_mtu) { - if (socket_mtu < DTLS_get_link_min_mtu(con)) { - BIO_printf(bio_err, "MTU too small. Must be at least %ld\n", - DTLS_get_link_min_mtu(con)); - BIO_free(sbio); - goto shut; - } - SSL_set_options(con, SSL_OP_NO_QUERY_MTU); - if (!DTLS_set_link_mtu(con, socket_mtu)) { - BIO_printf(bio_err, "Failed to set MTU\n"); - BIO_free(sbio); - goto shut; - } - } else { - /* want to do MTU discovery */ - BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL); - } - } else -#endif /* OPENSSL_NO_DTLS */ - sbio = BIO_new_socket(s, BIO_NOCLOSE); - - if (nbio_test) { - BIO *test; - - test = BIO_new(BIO_f_nbio_test()); - sbio = BIO_push(test, sbio); - } - - if (c_debug) { - BIO_set_callback(sbio, bio_dump_callback); - BIO_set_callback_arg(sbio, (char *)bio_c_out); - } - if (c_msg) { -#ifndef OPENSSL_NO_SSL_TRACE - if (c_msg == 2) - SSL_set_msg_callback(con, SSL_trace); - else -#endif - SSL_set_msg_callback(con, msg_cb); - SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out); - } - - if (c_tlsextdebug) { - SSL_set_tlsext_debug_callback(con, tlsext_cb); - SSL_set_tlsext_debug_arg(con, bio_c_out); - } -#ifndef OPENSSL_NO_OCSP - if (c_status_req) { - SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp); - SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb); - SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out); - } -#endif - - SSL_set_bio(con, sbio, sbio); - SSL_set_connect_state(con); - - /* ok, lets connect */ - if (fileno_stdin() > SSL_get_fd(con)) - width = fileno_stdin() + 1; - else - width = SSL_get_fd(con) + 1; - - read_tty = 1; - write_tty = 0; - tty_on = 0; - read_ssl = 1; - write_ssl = 1; - - cbuf_len = 0; - cbuf_off = 0; - sbuf_len = 0; - sbuf_off = 0; - - switch ((PROTOCOL_CHOICE) starttls_proto) { - case PROTO_OFF: - break; - case PROTO_LMTP: - case PROTO_SMTP: - { - /* - * This is an ugly hack that does a lot of assumptions. We do - * have to handle multi-line responses which may come in a single - * packet or not. We therefore have to use BIO_gets() which does - * need a buffering BIO. So during the initial chitchat we do - * push a buffering BIO into the chain that is removed again - * later on to not disturb the rest of the s_client operation. - */ - int foundit = 0; - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - /* Wait for multi-line response to end from LMTP or SMTP */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - } while (mbuf_len > 3 && mbuf[3] == '-'); - if (protohost == NULL) - protohost = "mail.example.com"; - if (starttls_proto == (int)PROTO_LMTP) - BIO_printf(fbio, "LHLO %s\r\n", protohost); - else - BIO_printf(fbio, "EHLO %s\r\n", protohost); - (void)BIO_flush(fbio); - /* - * Wait for multi-line response to end LHLO LMTP or EHLO SMTP - * response. - */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - if (strstr(mbuf, "STARTTLS")) - foundit = 1; - } while (mbuf_len > 3 && mbuf[3] == '-'); - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - if (!foundit) - BIO_printf(bio_err, - "Didn't find STARTTLS in server response," - " trying anyway...\n"); - BIO_printf(sbio, "STARTTLS\r\n"); - BIO_read(sbio, sbuf, BUFSIZZ); - } - break; - case PROTO_POP3: - { - BIO_read(sbio, mbuf, BUFSIZZ); - BIO_printf(sbio, "STLS\r\n"); - mbuf_len = BIO_read(sbio, sbuf, BUFSIZZ); - if (mbuf_len < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto end; - } - } - break; - case PROTO_IMAP: - { - int foundit = 0; - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - BIO_gets(fbio, mbuf, BUFSIZZ); - /* STARTTLS command requires CAPABILITY... */ - BIO_printf(fbio, ". CAPABILITY\r\n"); - (void)BIO_flush(fbio); - /* wait for multi-line CAPABILITY response */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - if (strstr(mbuf, "STARTTLS")) - foundit = 1; - } - while (mbuf_len > 3 && mbuf[0] != '.'); - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - if (!foundit) - BIO_printf(bio_err, - "Didn't find STARTTLS in server response," - " trying anyway...\n"); - BIO_printf(sbio, ". STARTTLS\r\n"); - BIO_read(sbio, sbuf, BUFSIZZ); - } - break; - case PROTO_FTP: - { - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - /* wait for multi-line response to end from FTP */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - } - while (mbuf_len > 3 && (!isdigit(mbuf[0]) || !isdigit(mbuf[1]) || !isdigit(mbuf[2]) || mbuf[3] != ' ')); - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - BIO_printf(sbio, "AUTH TLS\r\n"); - BIO_read(sbio, sbuf, BUFSIZZ); - } - break; - case PROTO_XMPP: - case PROTO_XMPP_SERVER: - { - int seen = 0; - BIO_printf(sbio, "<stream:stream " - "xmlns:stream='http://etherx.jabber.org/streams' " - "xmlns='jabber:%s' to='%s' version='1.0'>", - starttls_proto == PROTO_XMPP ? "client" : "server", - protohost ? protohost : host); - seen = BIO_read(sbio, mbuf, BUFSIZZ); - if (seen < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto end; - } - mbuf[seen] = '\0'; - while (!strstr - (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'") - && !strstr(mbuf, - "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"")) - { - seen = BIO_read(sbio, mbuf, BUFSIZZ); - - if (seen <= 0) - goto shut; - - mbuf[seen] = '\0'; - } - BIO_printf(sbio, - "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"); - seen = BIO_read(sbio, sbuf, BUFSIZZ); - if (seen < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto shut; - } - sbuf[seen] = '\0'; - if (!strstr(sbuf, "<proceed")) - goto shut; - mbuf[0] = '\0'; - } - break; - case PROTO_TELNET: - { - static const unsigned char tls_do[] = { - /* IAC DO START_TLS */ - 255, 253, 46 - }; - static const unsigned char tls_will[] = { - /* IAC WILL START_TLS */ - 255, 251, 46 - }; - static const unsigned char tls_follows[] = { - /* IAC SB START_TLS FOLLOWS IAC SE */ - 255, 250, 46, 1, 255, 240 - }; - int bytes; - - /* Telnet server should demand we issue START_TLS */ - bytes = BIO_read(sbio, mbuf, BUFSIZZ); - if (bytes != 3 || memcmp(mbuf, tls_do, 3) != 0) - goto shut; - /* Agree to issue START_TLS and send the FOLLOWS sub-command */ - BIO_write(sbio, tls_will, 3); - BIO_write(sbio, tls_follows, 6); - (void)BIO_flush(sbio); - /* Telnet server also sent the FOLLOWS sub-command */ - bytes = BIO_read(sbio, mbuf, BUFSIZZ); - if (bytes != 6 || memcmp(mbuf, tls_follows, 6) != 0) - goto shut; - } - break; - case PROTO_CONNECT: - { - enum { - error_proto, /* Wrong protocol, not even HTTP */ - error_connect, /* CONNECT failed */ - success - } foundit = error_connect; - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - BIO_printf(fbio, "CONNECT %s HTTP/1.0\r\n\r\n", connectstr); - (void)BIO_flush(fbio); - /* - * The first line is the HTTP response. According to RFC 7230, - * it's formatted exactly like this: - * - * HTTP/d.d ddd Reason text\r\n - */ - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - if (mbuf_len < (int)strlen("HTTP/1.0 200")) { - BIO_printf(bio_err, - "%s: HTTP CONNECT failed, insufficient response " - "from proxy (got %d octets)\n", prog, mbuf_len); - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - goto shut; - } - if (mbuf[8] != ' ') { - BIO_printf(bio_err, - "%s: HTTP CONNECT failed, incorrect response " - "from proxy\n", prog); - foundit = error_proto; - } else if (mbuf[9] != '2') { - BIO_printf(bio_err, "%s: HTTP CONNECT failed: %s ", prog, - &mbuf[9]); - } else { - foundit = success; - } - if (foundit != error_proto) { - /* Read past all following headers */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - } while (mbuf_len > 2); - } - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - if (foundit != success) { - goto shut; - } - } - break; - case PROTO_IRC: - { - int numeric; - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - BIO_printf(fbio, "STARTTLS\r\n"); - (void)BIO_flush(fbio); - width = SSL_get_fd(con) + 1; - - do { - numeric = 0; - - FD_ZERO(&readfds); - openssl_fdset(SSL_get_fd(con), &readfds); - timeout.tv_sec = S_CLIENT_IRC_READ_TIMEOUT; - timeout.tv_usec = 0; - /* - * If the IRCd doesn't respond within - * S_CLIENT_IRC_READ_TIMEOUT seconds, assume - * it doesn't support STARTTLS. Many IRCds - * will not give _any_ sort of response to a - * STARTTLS command when it's not supported. - */ - if (!BIO_get_buffer_num_lines(fbio) - && !BIO_pending(fbio) - && !BIO_pending(sbio) - && select(width, (void *)&readfds, NULL, NULL, - &timeout) < 1) { - BIO_printf(bio_err, - "Timeout waiting for response (%d seconds).\n", - S_CLIENT_IRC_READ_TIMEOUT); - break; - } - - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - if (mbuf_len < 1 || sscanf(mbuf, "%*s %d", &numeric) != 1) - break; - /* :example.net 451 STARTTLS :You have not registered */ - /* :example.net 421 STARTTLS :Unknown command */ - if ((numeric == 451 || numeric == 421) - && strstr(mbuf, "STARTTLS") != NULL) { - BIO_printf(bio_err, "STARTTLS not supported: %s", mbuf); - break; - } - if (numeric == 691) { - BIO_printf(bio_err, "STARTTLS negotiation failed: "); - ERR_print_errors(bio_err); - break; - } - } while (numeric != 670); - - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - if (numeric != 670) { - BIO_printf(bio_err, "Server does not support STARTTLS.\n"); - ret = 1; - goto shut; - } - } - break; - case PROTO_MYSQL: - { - /* SSL request packet */ - static const unsigned char ssl_req[] = { - /* payload_length, sequence_id */ - 0x20, 0x00, 0x00, 0x01, - /* payload */ - /* capability flags, CLIENT_SSL always set */ - 0x85, 0xae, 0x7f, 0x00, - /* max-packet size */ - 0x00, 0x00, 0x00, 0x01, - /* character set */ - 0x21, - /* string[23] reserved (all [0]) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - int bytes = 0; - int ssl_flg = 0x800; - int pos; - const unsigned char *packet = (const unsigned char *)sbuf; - - /* Receiving Initial Handshake packet. */ - bytes = BIO_read(sbio, (void *)packet, BUFSIZZ); - if (bytes < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto shut; - /* Packet length[3], Packet number[1] + minimum payload[17] */ - } else if (bytes < 21) { - BIO_printf(bio_err, "MySQL packet too short.\n"); - goto shut; - } else if (bytes != (4 + packet[0] + - (packet[1] << 8) + - (packet[2] << 16))) { - BIO_printf(bio_err, "MySQL packet length does not match.\n"); - goto shut; - /* protocol version[1] */ - } else if (packet[4] != 0xA) { - BIO_printf(bio_err, - "Only MySQL protocol version 10 is supported.\n"); - goto shut; - } - - pos = 5; - /* server version[string+NULL] */ - for (;;) { - if (pos >= bytes) { - BIO_printf(bio_err, "Cannot confirm server version. "); - goto shut; - } else if (packet[pos++] == '\0') { - break; - } - } - - /* make sure we have at least 15 bytes left in the packet */ - if (pos + 15 > bytes) { - BIO_printf(bio_err, - "MySQL server handshake packet is broken.\n"); - goto shut; - } - - pos += 12; /* skip over conn id[4] + SALT[8] */ - if (packet[pos++] != '\0') { /* verify filler */ - BIO_printf(bio_err, - "MySQL packet is broken.\n"); - goto shut; - } - - /* capability flags[2] */ - if (!((packet[pos] + (packet[pos + 1] << 8)) & ssl_flg)) { - BIO_printf(bio_err, "MySQL server does not support SSL.\n"); - goto shut; - } - - /* Sending SSL Handshake packet. */ - BIO_write(sbio, ssl_req, sizeof(ssl_req)); - (void)BIO_flush(sbio); - } - break; - case PROTO_POSTGRES: - { - static const unsigned char ssl_request[] = { - /* Length SSLRequest */ - 0, 0, 0, 8, 4, 210, 22, 47 - }; - int bytes; - - /* Send SSLRequest packet */ - BIO_write(sbio, ssl_request, 8); - (void)BIO_flush(sbio); - - /* Reply will be a single S if SSL is enabled */ - bytes = BIO_read(sbio, sbuf, BUFSIZZ); - if (bytes != 1 || sbuf[0] != 'S') - goto shut; - } - break; - case PROTO_NNTP: - { - int foundit = 0; - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - BIO_gets(fbio, mbuf, BUFSIZZ); - /* STARTTLS command requires CAPABILITIES... */ - BIO_printf(fbio, "CAPABILITIES\r\n"); - (void)BIO_flush(fbio); - /* wait for multi-line CAPABILITIES response */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - if (strstr(mbuf, "STARTTLS")) - foundit = 1; - } while (mbuf_len > 1 && mbuf[0] != '.'); - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - if (!foundit) - BIO_printf(bio_err, - "Didn't find STARTTLS in server response," - " trying anyway...\n"); - BIO_printf(sbio, "STARTTLS\r\n"); - mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ); - if (mbuf_len < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto end; - } - mbuf[mbuf_len] = '\0'; - if (strstr(mbuf, "382") == NULL) { - BIO_printf(bio_err, "STARTTLS failed: %s", mbuf); - goto shut; - } - } - break; - case PROTO_SIEVE: - { - int foundit = 0; - BIO *fbio = BIO_new(BIO_f_buffer()); - - BIO_push(fbio, sbio); - /* wait for multi-line response to end from Sieve */ - do { - mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); - /* - * According to RFC 5804 § 1.7, capability - * is case-insensitive, make it uppercase - */ - if (mbuf_len > 1 && mbuf[0] == '"') { - make_uppercase(mbuf); - if (strncmp(mbuf, "\"STARTTLS\"", 10) == 0) - foundit = 1; - } - } while (mbuf_len > 1 && mbuf[0] == '"'); - (void)BIO_flush(fbio); - BIO_pop(fbio); - BIO_free(fbio); - if (!foundit) - BIO_printf(bio_err, - "Didn't find STARTTLS in server response," - " trying anyway...\n"); - BIO_printf(sbio, "STARTTLS\r\n"); - mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ); - if (mbuf_len < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto end; - } - mbuf[mbuf_len] = '\0'; - if (mbuf_len < 2) { - BIO_printf(bio_err, "STARTTLS failed: %s", mbuf); - goto shut; - } - /* - * According to RFC 5804 § 2.2, response codes are case- - * insensitive, make it uppercase but preserve the response. - */ - strncpy(sbuf, mbuf, 2); - make_uppercase(sbuf); - if (strncmp(sbuf, "OK", 2) != 0) { - BIO_printf(bio_err, "STARTTLS not supported: %s", mbuf); - goto shut; - } - } - break; - case PROTO_LDAP: - { - /* StartTLS Operation according to RFC 4511 */ - static char ldap_tls_genconf[] = "asn1=SEQUENCE:LDAPMessage\n" - "[LDAPMessage]\n" - "messageID=INTEGER:1\n" - "extendedReq=EXPLICIT:23A,IMPLICIT:0C," - "FORMAT:ASCII,OCT:1.3.6.1.4.1.1466.20037\n"; - long errline = -1; - char *genstr = NULL; - int result = -1; - ASN1_TYPE *atyp = NULL; - BIO *ldapbio = BIO_new(BIO_s_mem()); - CONF *cnf = NCONF_new(NULL); - - if (cnf == NULL) { - BIO_free(ldapbio); - goto end; - } - BIO_puts(ldapbio, ldap_tls_genconf); - if (NCONF_load_bio(cnf, ldapbio, &errline) <= 0) { - BIO_free(ldapbio); - NCONF_free(cnf); - if (errline <= 0) { - BIO_printf(bio_err, "NCONF_load_bio failed\n"); - goto end; - } else { - BIO_printf(bio_err, "Error on line %ld\n", errline); - goto end; - } - } - BIO_free(ldapbio); - genstr = NCONF_get_string(cnf, "default", "asn1"); - if (genstr == NULL) { - NCONF_free(cnf); - BIO_printf(bio_err, "NCONF_get_string failed\n"); - goto end; - } - atyp = ASN1_generate_nconf(genstr, cnf); - if (atyp == NULL) { - NCONF_free(cnf); - BIO_printf(bio_err, "ASN1_generate_nconf failed\n"); - goto end; - } - NCONF_free(cnf); - - /* Send SSLRequest packet */ - BIO_write(sbio, atyp->value.sequence->data, - atyp->value.sequence->length); - (void)BIO_flush(sbio); - ASN1_TYPE_free(atyp); - - mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ); - if (mbuf_len < 0) { - BIO_printf(bio_err, "BIO_read failed\n"); - goto end; - } - result = ldap_ExtendedResponse_parse(mbuf, mbuf_len); - if (result < 0) { - BIO_printf(bio_err, "ldap_ExtendedResponse_parse failed\n"); - goto shut; - } else if (result > 0) { - BIO_printf(bio_err, "STARTTLS failed, LDAP Result Code: %i\n", - result); - goto shut; - } - mbuf_len = 0; - } - break; - } - - if (early_data_file != NULL - && ((SSL_get0_session(con) != NULL - && SSL_SESSION_get_max_early_data(SSL_get0_session(con)) > 0) - || (psksess != NULL - && SSL_SESSION_get_max_early_data(psksess) > 0))) { - BIO *edfile = BIO_new_file(early_data_file, "r"); - size_t readbytes, writtenbytes; - int finish = 0; - - if (edfile == NULL) { - BIO_printf(bio_err, "Cannot open early data file\n"); - goto shut; - } - - while (!finish) { - if (!BIO_read_ex(edfile, cbuf, BUFSIZZ, &readbytes)) - finish = 1; - - while (!SSL_write_early_data(con, cbuf, readbytes, &writtenbytes)) { - switch (SSL_get_error(con, 0)) { - case SSL_ERROR_WANT_WRITE: - case SSL_ERROR_WANT_ASYNC: - case SSL_ERROR_WANT_READ: - /* Just keep trying - busy waiting */ - continue; - default: - BIO_printf(bio_err, "Error writing early data\n"); - BIO_free(edfile); - ERR_print_errors(bio_err); - goto shut; - } - } - } - - BIO_free(edfile); - } - - for (;;) { - FD_ZERO(&readfds); - FD_ZERO(&writefds); - - if (SSL_is_dtls(con) && DTLSv1_get_timeout(con, &timeout)) - timeoutp = &timeout; - else - timeoutp = NULL; - - if (!SSL_is_init_finished(con) && SSL_total_renegotiations(con) == 0 - && SSL_get_key_update_type(con) == SSL_KEY_UPDATE_NONE) { - in_init = 1; - tty_on = 0; - } else { - tty_on = 1; - if (in_init) { - in_init = 0; - - if (c_brief) { - BIO_puts(bio_err, "CONNECTION ESTABLISHED\n"); - print_ssl_summary(con); - } - - print_stuff(bio_c_out, con, full_log); - if (full_log > 0) - full_log--; - - if (starttls_proto) { - BIO_write(bio_err, mbuf, mbuf_len); - /* We don't need to know any more */ - if (!reconnect) - starttls_proto = PROTO_OFF; - } - - if (reconnect) { - reconnect--; - BIO_printf(bio_c_out, - "drop connection and then reconnect\n"); - do_ssl_shutdown(con); - SSL_set_connect_state(con); - BIO_closesocket(SSL_get_fd(con)); - goto re_start; - } - } - } - - ssl_pending = read_ssl && SSL_has_pending(con); - - if (!ssl_pending) { -#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) - if (tty_on) { - /* - * Note that select() returns when read _would not block_, - * and EOF satisfies that. To avoid a CPU-hogging loop, - * set the flag so we exit. - */ - if (read_tty && !at_eof) - openssl_fdset(fileno_stdin(), &readfds); -#if !defined(OPENSSL_SYS_VMS) - if (write_tty) - openssl_fdset(fileno_stdout(), &writefds); -#endif - } - if (read_ssl) - openssl_fdset(SSL_get_fd(con), &readfds); - if (write_ssl) - openssl_fdset(SSL_get_fd(con), &writefds); -#else - if (!tty_on || !write_tty) { - if (read_ssl) - openssl_fdset(SSL_get_fd(con), &readfds); - if (write_ssl) - openssl_fdset(SSL_get_fd(con), &writefds); - } -#endif - - /* - * Note: under VMS with SOCKETSHR the second parameter is - * currently of type (int *) whereas under other systems it is - * (void *) if you don't have a cast it will choke the compiler: - * if you do have a cast then you can either go for (int *) or - * (void *). - */ -#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) - /* - * Under Windows/DOS we make the assumption that we can always - * write to the tty: therefore if we need to write to the tty we - * just fall through. Otherwise we timeout the select every - * second and see if there are any keypresses. Note: this is a - * hack, in a proper Windows application we wouldn't do this. - */ - i = 0; - if (!write_tty) { - if (read_tty) { - tv.tv_sec = 1; - tv.tv_usec = 0; - i = select(width, (void *)&readfds, (void *)&writefds, - NULL, &tv); - if (!i && (!has_stdin_waiting() || !read_tty)) - continue; - } else - i = select(width, (void *)&readfds, (void *)&writefds, - NULL, timeoutp); - } -#else - i = select(width, (void *)&readfds, (void *)&writefds, - NULL, timeoutp); -#endif - if (i < 0) { - BIO_printf(bio_err, "bad select %d\n", - get_last_socket_error()); - goto shut; - } - } - - if (SSL_is_dtls(con) && DTLSv1_handle_timeout(con) > 0) - BIO_printf(bio_err, "TIMEOUT occurred\n"); - - if (!ssl_pending && FD_ISSET(SSL_get_fd(con), &writefds)) { - k = SSL_write(con, &(cbuf[cbuf_off]), (unsigned int)cbuf_len); - switch (SSL_get_error(con, k)) { - case SSL_ERROR_NONE: - cbuf_off += k; - cbuf_len -= k; - if (k <= 0) - goto end; - /* we have done a write(con,NULL,0); */ - if (cbuf_len <= 0) { - read_tty = 1; - write_ssl = 0; - } else { /* if (cbuf_len > 0) */ - - read_tty = 0; - write_ssl = 1; - } - break; - case SSL_ERROR_WANT_WRITE: - BIO_printf(bio_c_out, "write W BLOCK\n"); - write_ssl = 1; - read_tty = 0; - break; - case SSL_ERROR_WANT_ASYNC: - BIO_printf(bio_c_out, "write A BLOCK\n"); - wait_for_async(con); - write_ssl = 1; - read_tty = 0; - break; - case SSL_ERROR_WANT_READ: - BIO_printf(bio_c_out, "write R BLOCK\n"); - write_tty = 0; - read_ssl = 1; - write_ssl = 0; - break; - case SSL_ERROR_WANT_X509_LOOKUP: - BIO_printf(bio_c_out, "write X BLOCK\n"); - break; - case SSL_ERROR_ZERO_RETURN: - if (cbuf_len != 0) { - BIO_printf(bio_c_out, "shutdown\n"); - ret = 0; - goto shut; - } else { - read_tty = 1; - write_ssl = 0; - break; - } - - case SSL_ERROR_SYSCALL: - if ((k != 0) || (cbuf_len != 0)) { - BIO_printf(bio_err, "write:errno=%d\n", - get_last_socket_error()); - goto shut; - } else { - read_tty = 1; - write_ssl = 0; - } - break; - case SSL_ERROR_WANT_ASYNC_JOB: - /* This shouldn't ever happen in s_client - treat as an error */ - case SSL_ERROR_SSL: - ERR_print_errors(bio_err); - goto shut; - } - } -#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_VMS) - /* Assume Windows/DOS/BeOS can always write */ - else if (!ssl_pending && write_tty) -#else - else if (!ssl_pending && FD_ISSET(fileno_stdout(), &writefds)) -#endif - { -#ifdef CHARSET_EBCDIC - ascii2ebcdic(&(sbuf[sbuf_off]), &(sbuf[sbuf_off]), sbuf_len); -#endif - i = raw_write_stdout(&(sbuf[sbuf_off]), sbuf_len); - - if (i <= 0) { - BIO_printf(bio_c_out, "DONE\n"); - ret = 0; - goto shut; - } - - sbuf_len -= i; - sbuf_off += i; - if (sbuf_len <= 0) { - read_ssl = 1; - write_tty = 0; - } - } else if (ssl_pending || FD_ISSET(SSL_get_fd(con), &readfds)) { -#ifdef RENEG - { - static int iiii; - if (++iiii == 52) { - SSL_renegotiate(con); - iiii = 0; - } - } -#endif - k = SSL_read(con, sbuf, 1024 /* BUFSIZZ */ ); - - switch (SSL_get_error(con, k)) { - case SSL_ERROR_NONE: - if (k <= 0) - goto end; - sbuf_off = 0; - sbuf_len = k; - - read_ssl = 0; - write_tty = 1; - break; - case SSL_ERROR_WANT_ASYNC: - BIO_printf(bio_c_out, "read A BLOCK\n"); - wait_for_async(con); - write_tty = 0; - read_ssl = 1; - if ((read_tty == 0) && (write_ssl == 0)) - write_ssl = 1; - break; - case SSL_ERROR_WANT_WRITE: - BIO_printf(bio_c_out, "read W BLOCK\n"); - write_ssl = 1; - read_tty = 0; - break; - case SSL_ERROR_WANT_READ: - BIO_printf(bio_c_out, "read R BLOCK\n"); - write_tty = 0; - read_ssl = 1; - if ((read_tty == 0) && (write_ssl == 0)) - write_ssl = 1; - break; - case SSL_ERROR_WANT_X509_LOOKUP: - BIO_printf(bio_c_out, "read X BLOCK\n"); - break; - case SSL_ERROR_SYSCALL: - ret = get_last_socket_error(); - if (c_brief) - BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n"); - else - BIO_printf(bio_err, "read:errno=%d\n", ret); - goto shut; - case SSL_ERROR_ZERO_RETURN: - BIO_printf(bio_c_out, "closed\n"); - ret = 0; - goto shut; - case SSL_ERROR_WANT_ASYNC_JOB: - /* This shouldn't ever happen in s_client. Treat as an error */ - case SSL_ERROR_SSL: - ERR_print_errors(bio_err); - goto shut; - } - } -/* OPENSSL_SYS_MSDOS includes OPENSSL_SYS_WINDOWS */ -#if defined(OPENSSL_SYS_MSDOS) - else if (has_stdin_waiting()) -#else - else if (FD_ISSET(fileno_stdin(), &readfds)) -#endif - { - if (crlf) { - int j, lf_num; - - i = raw_read_stdin(cbuf, BUFSIZZ / 2); - lf_num = 0; - /* both loops are skipped when i <= 0 */ - for (j = 0; j < i; j++) - if (cbuf[j] == '\n') - lf_num++; - for (j = i - 1; j >= 0; j--) { - cbuf[j + lf_num] = cbuf[j]; - if (cbuf[j] == '\n') { - lf_num--; - i++; - cbuf[j + lf_num] = '\r'; - } - } - assert(lf_num == 0); - } else - i = raw_read_stdin(cbuf, BUFSIZZ); -#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) - if (i == 0) - at_eof = 1; -#endif - - if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q' && cmdletters))) { - BIO_printf(bio_err, "DONE\n"); - ret = 0; - goto shut; - } - - if ((!c_ign_eof) && (cbuf[0] == 'R' && cmdletters)) { - BIO_printf(bio_err, "RENEGOTIATING\n"); - SSL_renegotiate(con); - cbuf_len = 0; - } else if (!c_ign_eof && (cbuf[0] == 'K' || cbuf[0] == 'k' ) - && cmdletters) { - BIO_printf(bio_err, "KEYUPDATE\n"); - SSL_key_update(con, - cbuf[0] == 'K' ? SSL_KEY_UPDATE_REQUESTED - : SSL_KEY_UPDATE_NOT_REQUESTED); - cbuf_len = 0; - } -#ifndef OPENSSL_NO_HEARTBEATS - else if ((!c_ign_eof) && (cbuf[0] == 'B' && cmdletters)) { - BIO_printf(bio_err, "HEARTBEATING\n"); - SSL_heartbeat(con); - cbuf_len = 0; - } -#endif - else { - cbuf_len = i; - cbuf_off = 0; -#ifdef CHARSET_EBCDIC - ebcdic2ascii(cbuf, cbuf, i); -#endif - } - - write_ssl = 1; - read_tty = 0; - } - } - - ret = 0; - shut: - if (in_init) - print_stuff(bio_c_out, con, full_log); - do_ssl_shutdown(con); - - /* - * If we ended with an alert being sent, but still with data in the - * network buffer to be read, then calling BIO_closesocket() will - * result in a TCP-RST being sent. On some platforms (notably - * Windows) then this will result in the peer immediately abandoning - * the connection including any buffered alert data before it has - * had a chance to be read. Shutting down the sending side first, - * and then closing the socket sends TCP-FIN first followed by - * TCP-RST. This seems to allow the peer to read the alert data. - */ - shutdown(SSL_get_fd(con), 1); /* SHUT_WR */ - /* - * We just said we have nothing else to say, but it doesn't mean that - * the other side has nothing. It's even recommended to consume incoming - * data. [In testing context this ensures that alerts are passed on...] - */ - timeout.tv_sec = 0; - timeout.tv_usec = 500000; /* some extreme round-trip */ - do { - FD_ZERO(&readfds); - openssl_fdset(s, &readfds); - } while (select(s + 1, &readfds, NULL, NULL, &timeout) > 0 - && BIO_read(sbio, sbuf, BUFSIZZ) > 0); - - BIO_closesocket(SSL_get_fd(con)); - end: - if (con != NULL) { - if (prexit != 0) - print_stuff(bio_c_out, con, 1); - SSL_free(con); - } - SSL_SESSION_free(psksess); -#if !defined(OPENSSL_NO_NEXTPROTONEG) - OPENSSL_free(next_proto.data); -#endif - SSL_CTX_free(ctx); - set_keylog_file(NULL, NULL); - X509_free(cert); - sk_X509_CRL_pop_free(crls, X509_CRL_free); - EVP_PKEY_free(key); - sk_X509_pop_free(chain, X509_free); - OPENSSL_free(pass); -#ifndef OPENSSL_NO_SRP - OPENSSL_free(srp_arg.srppassin); -#endif - OPENSSL_free(connectstr); - OPENSSL_free(bindstr); - OPENSSL_free(host); - OPENSSL_free(port); - X509_VERIFY_PARAM_free(vpm); - ssl_excert_free(exc); - sk_OPENSSL_STRING_free(ssl_args); - sk_OPENSSL_STRING_free(dane_tlsa_rrset); - SSL_CONF_CTX_free(cctx); - OPENSSL_clear_free(cbuf, BUFSIZZ); - OPENSSL_clear_free(sbuf, BUFSIZZ); - OPENSSL_clear_free(mbuf, BUFSIZZ); - release_engine(e); - BIO_free(bio_c_out); - bio_c_out = NULL; - BIO_free(bio_c_msg); - bio_c_msg = NULL; - return ret; -} - -static void print_stuff(BIO *bio, SSL *s, int full) -{ - X509 *peer = NULL; - STACK_OF(X509) *sk; - const SSL_CIPHER *c; - int i, istls13 = (SSL_version(s) == TLS1_3_VERSION); - long verify_result; -#ifndef OPENSSL_NO_COMP - const COMP_METHOD *comp, *expansion; -#endif - unsigned char *exportedkeymat; -#ifndef OPENSSL_NO_CT - const SSL_CTX *ctx = SSL_get_SSL_CTX(s); -#endif - - if (full) { - int got_a_chain = 0; - - sk = SSL_get_peer_cert_chain(s); - if (sk != NULL) { - got_a_chain = 1; - - BIO_printf(bio, "---\nCertificate chain\n"); - for (i = 0; i < sk_X509_num(sk); i++) { - BIO_printf(bio, "%2d s:", i); - X509_NAME_print_ex(bio, X509_get_subject_name(sk_X509_value(sk, i)), 0, get_nameopt()); - BIO_puts(bio, "\n"); - BIO_printf(bio, " i:"); - X509_NAME_print_ex(bio, X509_get_issuer_name(sk_X509_value(sk, i)), 0, get_nameopt()); - BIO_puts(bio, "\n"); - if (c_showcerts) - PEM_write_bio_X509(bio, sk_X509_value(sk, i)); - } - } - - BIO_printf(bio, "---\n"); - peer = SSL_get_peer_certificate(s); - if (peer != NULL) { - BIO_printf(bio, "Server certificate\n"); - - /* Redundant if we showed the whole chain */ - if (!(c_showcerts && got_a_chain)) - PEM_write_bio_X509(bio, peer); - dump_cert_text(bio, peer); - } else { - BIO_printf(bio, "no peer certificate available\n"); - } - print_ca_names(bio, s); - - ssl_print_sigalgs(bio, s); - ssl_print_tmp_key(bio, s); - -#ifndef OPENSSL_NO_CT - /* - * When the SSL session is anonymous, or resumed via an abbreviated - * handshake, no SCTs are provided as part of the handshake. While in - * a resumed session SCTs may be present in the session's certificate, - * no callbacks are invoked to revalidate these, and in any case that - * set of SCTs may be incomplete. Thus it makes little sense to - * attempt to display SCTs from a resumed session's certificate, and of - * course none are associated with an anonymous peer. - */ - if (peer != NULL && !SSL_session_reused(s) && SSL_ct_is_enabled(s)) { - const STACK_OF(SCT) *scts = SSL_get0_peer_scts(s); - int sct_count = scts != NULL ? sk_SCT_num(scts) : 0; - - BIO_printf(bio, "---\nSCTs present (%i)\n", sct_count); - if (sct_count > 0) { - const CTLOG_STORE *log_store = SSL_CTX_get0_ctlog_store(ctx); - - BIO_printf(bio, "---\n"); - for (i = 0; i < sct_count; ++i) { - SCT *sct = sk_SCT_value(scts, i); - - BIO_printf(bio, "SCT validation status: %s\n", - SCT_validation_status_string(sct)); - SCT_print(sct, bio, 0, log_store); - if (i < sct_count - 1) - BIO_printf(bio, "\n---\n"); - } - BIO_printf(bio, "\n"); - } - } -#endif - - BIO_printf(bio, - "---\nSSL handshake has read %ju bytes " - "and written %ju bytes\n", - BIO_number_read(SSL_get_rbio(s)), - BIO_number_written(SSL_get_wbio(s))); - } - print_verify_detail(s, bio); - BIO_printf(bio, (SSL_session_reused(s) ? "---\nReused, " : "---\nNew, ")); - c = SSL_get_current_cipher(s); - BIO_printf(bio, "%s, Cipher is %s\n", - SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c)); - if (peer != NULL) { - EVP_PKEY *pktmp; - - pktmp = X509_get0_pubkey(peer); - BIO_printf(bio, "Server public key is %d bit\n", - EVP_PKEY_bits(pktmp)); - } - BIO_printf(bio, "Secure Renegotiation IS%s supported\n", - SSL_get_secure_renegotiation_support(s) ? "" : " NOT"); -#ifndef OPENSSL_NO_COMP - comp = SSL_get_current_compression(s); - expansion = SSL_get_current_expansion(s); - BIO_printf(bio, "Compression: %s\n", - comp ? SSL_COMP_get_name(comp) : "NONE"); - BIO_printf(bio, "Expansion: %s\n", - expansion ? SSL_COMP_get_name(expansion) : "NONE"); -#endif - -#ifdef SSL_DEBUG - { - /* Print out local port of connection: useful for debugging */ - int sock; - union BIO_sock_info_u info; - - sock = SSL_get_fd(s); - if ((info.addr = BIO_ADDR_new()) != NULL - && BIO_sock_info(sock, BIO_SOCK_INFO_ADDRESS, &info)) { - BIO_printf(bio_c_out, "LOCAL PORT is %u\n", - ntohs(BIO_ADDR_rawport(info.addr))); - } - BIO_ADDR_free(info.addr); - } -#endif - -#if !defined(OPENSSL_NO_NEXTPROTONEG) - if (next_proto.status != -1) { - const unsigned char *proto; - unsigned int proto_len; - SSL_get0_next_proto_negotiated(s, &proto, &proto_len); - BIO_printf(bio, "Next protocol: (%d) ", next_proto.status); - BIO_write(bio, proto, proto_len); - BIO_write(bio, "\n", 1); - } -#endif - { - const unsigned char *proto; - unsigned int proto_len; - SSL_get0_alpn_selected(s, &proto, &proto_len); - if (proto_len > 0) { - BIO_printf(bio, "ALPN protocol: "); - BIO_write(bio, proto, proto_len); - BIO_write(bio, "\n", 1); - } else - BIO_printf(bio, "No ALPN negotiated\n"); - } - -#ifndef OPENSSL_NO_SRTP - { - SRTP_PROTECTION_PROFILE *srtp_profile = - SSL_get_selected_srtp_profile(s); - - if (srtp_profile) - BIO_printf(bio, "SRTP Extension negotiated, profile=%s\n", - srtp_profile->name); - } -#endif - - if (istls13) { - switch (SSL_get_early_data_status(s)) { - case SSL_EARLY_DATA_NOT_SENT: - BIO_printf(bio, "Early data was not sent\n"); - break; - - case SSL_EARLY_DATA_REJECTED: - BIO_printf(bio, "Early data was rejected\n"); - break; - - case SSL_EARLY_DATA_ACCEPTED: - BIO_printf(bio, "Early data was accepted\n"); - break; - - } - - /* - * We also print the verify results when we dump session information, - * but in TLSv1.3 we may not get that right away (or at all) depending - * on when we get a NewSessionTicket. Therefore we print it now as well. - */ - verify_result = SSL_get_verify_result(s); - BIO_printf(bio, "Verify return code: %ld (%s)\n", verify_result, - X509_verify_cert_error_string(verify_result)); - } else { - /* In TLSv1.3 we do this on arrival of a NewSessionTicket */ - SSL_SESSION_print(bio, SSL_get_session(s)); - } - - if (SSL_get_session(s) != NULL && keymatexportlabel != NULL) { - BIO_printf(bio, "Keying material exporter:\n"); - BIO_printf(bio, " Label: '%s'\n", keymatexportlabel); - BIO_printf(bio, " Length: %i bytes\n", keymatexportlen); - exportedkeymat = app_malloc(keymatexportlen, "export key"); - if (!SSL_export_keying_material(s, exportedkeymat, - keymatexportlen, - keymatexportlabel, - strlen(keymatexportlabel), - NULL, 0, 0)) { - BIO_printf(bio, " Error\n"); - } else { - BIO_printf(bio, " Keying material: "); - for (i = 0; i < keymatexportlen; i++) - BIO_printf(bio, "%02X", exportedkeymat[i]); - BIO_printf(bio, "\n"); - } - OPENSSL_free(exportedkeymat); - } - BIO_printf(bio, "---\n"); - X509_free(peer); - /* flush, or debugging output gets mixed with http response */ - (void)BIO_flush(bio); -} - -# ifndef OPENSSL_NO_OCSP -static int ocsp_resp_cb(SSL *s, void *arg) -{ - const unsigned char *p; - int len; - OCSP_RESPONSE *rsp; - len = SSL_get_tlsext_status_ocsp_resp(s, &p); - BIO_puts(arg, "OCSP response: "); - if (p == NULL) { - BIO_puts(arg, "no response sent\n"); - return 1; - } - rsp = d2i_OCSP_RESPONSE(NULL, &p, len); - if (rsp == NULL) { - BIO_puts(arg, "response parse error\n"); - BIO_dump_indent(arg, (char *)p, len, 4); - return 0; - } - BIO_puts(arg, "\n======================================\n"); - OCSP_RESPONSE_print(arg, rsp, 0); - BIO_puts(arg, "======================================\n"); - OCSP_RESPONSE_free(rsp); - return 1; -} -# endif - -static int ldap_ExtendedResponse_parse(const char *buf, long rem) -{ - const unsigned char *cur, *end; - long len; - int tag, xclass, inf, ret = -1; - - cur = (const unsigned char *)buf; - end = cur + rem; - - /* - * From RFC 4511: - * - * LDAPMessage ::= SEQUENCE { - * messageID MessageID, - * protocolOp CHOICE { - * ... - * extendedResp ExtendedResponse, - * ... }, - * controls [0] Controls OPTIONAL } - * - * ExtendedResponse ::= [APPLICATION 24] SEQUENCE { - * COMPONENTS OF LDAPResult, - * responseName [10] LDAPOID OPTIONAL, - * responseValue [11] OCTET STRING OPTIONAL } - * - * LDAPResult ::= SEQUENCE { - * resultCode ENUMERATED { - * success (0), - * ... - * other (80), - * ... }, - * matchedDN LDAPDN, - * diagnosticMessage LDAPString, - * referral [3] Referral OPTIONAL } - */ - - /* pull SEQUENCE */ - inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem); - if (inf != V_ASN1_CONSTRUCTED || tag != V_ASN1_SEQUENCE || - (rem = end - cur, len > rem)) { - BIO_printf(bio_err, "Unexpected LDAP response\n"); - goto end; - } - - rem = len; /* ensure that we don't overstep the SEQUENCE */ - - /* pull MessageID */ - inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem); - if (inf != V_ASN1_UNIVERSAL || tag != V_ASN1_INTEGER || - (rem = end - cur, len > rem)) { - BIO_printf(bio_err, "No MessageID\n"); - goto end; - } - - cur += len; /* shall we check for MessageId match or just skip? */ - - /* pull [APPLICATION 24] */ - rem = end - cur; - inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem); - if (inf != V_ASN1_CONSTRUCTED || xclass != V_ASN1_APPLICATION || - tag != 24) { - BIO_printf(bio_err, "Not ExtendedResponse\n"); - goto end; - } - - /* pull resultCode */ - rem = end - cur; - inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem); - if (inf != V_ASN1_UNIVERSAL || tag != V_ASN1_ENUMERATED || len == 0 || - (rem = end - cur, len > rem)) { - BIO_printf(bio_err, "Not LDAPResult\n"); - goto end; - } - - /* len should always be one, but just in case... */ - for (ret = 0, inf = 0; inf < len; inf++) { - ret <<= 8; - ret |= cur[inf]; - } - /* There is more data, but we don't care... */ - end: - return ret; -} - -/* - * Host dNS Name verifier: used for checking that the hostname is in dNS format - * before setting it as SNI - */ -static int is_dNS_name(const char *host) -{ - const size_t MAX_LABEL_LENGTH = 63; - size_t i; - int isdnsname = 0; - size_t length = strlen(host); - size_t label_length = 0; - int all_numeric = 1; - - /* - * Deviation from strict DNS name syntax, also check names with '_' - * Check DNS name syntax, any '-' or '.' must be internal, - * and on either side of each '.' we can't have a '-' or '.'. - * - * If the name has just one label, we don't consider it a DNS name. - */ - for (i = 0; i < length && label_length < MAX_LABEL_LENGTH; ++i) { - char c = host[i]; - - if ((c >= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z') - || c == '_') { - label_length += 1; - all_numeric = 0; - continue; - } - - if (c >= '0' && c <= '9') { - label_length += 1; - continue; - } - - /* Dot and hyphen cannot be first or last. */ - if (i > 0 && i < length - 1) { - if (c == '-') { - label_length += 1; - continue; - } - /* - * Next to a dot the preceding and following characters must not be - * another dot or a hyphen. Otherwise, record that the name is - * plausible, since it has two or more labels. - */ - if (c == '.' - && host[i + 1] != '.' - && host[i - 1] != '-' - && host[i + 1] != '-') { - label_length = 0; - isdnsname = 1; - continue; - } - } - isdnsname = 0; - break; - } - - /* dNS name must not be all numeric and labels must be shorter than 64 characters. */ - isdnsname &= !all_numeric && !(label_length == MAX_LABEL_LENGTH); - - return isdnsname; -} -#endif /* OPENSSL_NO_SOCK */ diff --git a/contrib/libs/openssl/apps/s_server.c b/contrib/libs/openssl/apps/s_server.c deleted file mode 100644 index 938e244222..0000000000 --- a/contrib/libs/openssl/apps/s_server.c +++ /dev/null @@ -1,3646 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved - * Copyright 2005 Nokia. All rights reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#if defined(_WIN32) -/* Included before async.h to avoid some warnings */ -# include <windows.h> -#endif - -#include <openssl/e_os2.h> -#include <openssl/async.h> -#include <openssl/ssl.h> - -#ifndef OPENSSL_NO_SOCK - -/* - * With IPv6, it looks like Digital has mixed up the proper order of - * recursive header file inclusion, resulting in the compiler complaining - * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is - * needed to have fileno() declared correctly... So let's define u_int - */ -#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) -# define __U_INT -typedef unsigned int u_int; -#endif - -#include <openssl/bn.h> -#include "apps.h" -#include "progs.h" -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/x509.h> -#include <openssl/ssl.h> -#include <openssl/rand.h> -#include <openssl/ocsp.h> -#ifndef OPENSSL_NO_DH -# include <openssl/dh.h> -#endif -#ifndef OPENSSL_NO_RSA -# include <openssl/rsa.h> -#endif -#ifndef OPENSSL_NO_SRP -# include <openssl/srp.h> -#endif -#include "s_apps.h" -#include "timeouts.h" -#ifdef CHARSET_EBCDIC -#include <openssl/ebcdic.h> -#endif -#include "internal/sockets.h" - -static int not_resumable_sess_cb(SSL *s, int is_forward_secure); -static int sv_body(int s, int stype, int prot, unsigned char *context); -static int www_body(int s, int stype, int prot, unsigned char *context); -static int rev_body(int s, int stype, int prot, unsigned char *context); -static void close_accept_socket(void); -static int init_ssl_connection(SSL *s); -static void print_stats(BIO *bp, SSL_CTX *ctx); -static int generate_session_id(SSL *ssl, unsigned char *id, - unsigned int *id_len); -static void init_session_cache_ctx(SSL_CTX *sctx); -static void free_sessions(void); -#ifndef OPENSSL_NO_DH -static DH *load_dh_param(const char *dhfile); -#endif -static void print_connection_info(SSL *con); - -static const int bufsize = 16 * 1024; -static int accept_socket = -1; - -#define TEST_CERT "server.pem" -#define TEST_CERT2 "server2.pem" - -static int s_nbio = 0; -static int s_nbio_test = 0; -static int s_crlf = 0; -static SSL_CTX *ctx = NULL; -static SSL_CTX *ctx2 = NULL; -static int www = 0; - -static BIO *bio_s_out = NULL; -static BIO *bio_s_msg = NULL; -static int s_debug = 0; -static int s_tlsextdebug = 0; -static int s_msg = 0; -static int s_quiet = 0; -static int s_ign_eof = 0; -static int s_brief = 0; - -static char *keymatexportlabel = NULL; -static int keymatexportlen = 20; - -static int async = 0; - -static const char *session_id_prefix = NULL; - -#ifndef OPENSSL_NO_DTLS -static int enable_timeouts = 0; -static long socket_mtu; -#endif - -/* - * We define this but make it always be 0 in no-dtls builds to simplify the - * code. - */ -static int dtlslisten = 0; -static int stateless = 0; - -static int early_data = 0; -static SSL_SESSION *psksess = NULL; - -static char *psk_identity = "Client_identity"; -char *psk_key = NULL; /* by default PSK is not used */ - -#ifndef OPENSSL_NO_PSK -static unsigned int psk_server_cb(SSL *ssl, const char *identity, - unsigned char *psk, - unsigned int max_psk_len) -{ - long key_len = 0; - unsigned char *key; - - if (s_debug) - BIO_printf(bio_s_out, "psk_server_cb\n"); - - if (SSL_version(ssl) >= TLS1_3_VERSION) { - /* - * This callback is designed for use in TLSv1.2. It is possible to use - * a single callback for all protocol versions - but it is preferred to - * use a dedicated callback for TLSv1.3. For TLSv1.3 we have - * psk_find_session_cb. - */ - return 0; - } - - if (identity == NULL) { - BIO_printf(bio_err, "Error: client did not send PSK identity\n"); - goto out_err; - } - if (s_debug) - BIO_printf(bio_s_out, "identity_len=%d identity=%s\n", - (int)strlen(identity), identity); - - /* here we could lookup the given identity e.g. from a database */ - if (strcmp(identity, psk_identity) != 0) { - BIO_printf(bio_s_out, "PSK warning: client identity not what we expected" - " (got '%s' expected '%s')\n", identity, psk_identity); - } else { - if (s_debug) - BIO_printf(bio_s_out, "PSK client identity found\n"); - } - - /* convert the PSK key to binary */ - key = OPENSSL_hexstr2buf(psk_key, &key_len); - if (key == NULL) { - BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n", - psk_key); - return 0; - } - if (key_len > (int)max_psk_len) { - BIO_printf(bio_err, - "psk buffer of callback is too small (%d) for key (%ld)\n", - max_psk_len, key_len); - OPENSSL_free(key); - return 0; - } - - memcpy(psk, key, key_len); - OPENSSL_free(key); - - if (s_debug) - BIO_printf(bio_s_out, "fetched PSK len=%ld\n", key_len); - return key_len; - out_err: - if (s_debug) - BIO_printf(bio_err, "Error in PSK server callback\n"); - (void)BIO_flush(bio_err); - (void)BIO_flush(bio_s_out); - return 0; -} -#endif - -static int psk_find_session_cb(SSL *ssl, const unsigned char *identity, - size_t identity_len, SSL_SESSION **sess) -{ - SSL_SESSION *tmpsess = NULL; - unsigned char *key; - long key_len; - const SSL_CIPHER *cipher = NULL; - - if (strlen(psk_identity) != identity_len - || memcmp(psk_identity, identity, identity_len) != 0) { - *sess = NULL; - return 1; - } - - if (psksess != NULL) { - SSL_SESSION_up_ref(psksess); - *sess = psksess; - return 1; - } - - key = OPENSSL_hexstr2buf(psk_key, &key_len); - if (key == NULL) { - BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n", - psk_key); - return 0; - } - - /* We default to SHA256 */ - cipher = SSL_CIPHER_find(ssl, tls13_aes128gcmsha256_id); - if (cipher == NULL) { - BIO_printf(bio_err, "Error finding suitable ciphersuite\n"); - OPENSSL_free(key); - return 0; - } - - tmpsess = SSL_SESSION_new(); - if (tmpsess == NULL - || !SSL_SESSION_set1_master_key(tmpsess, key, key_len) - || !SSL_SESSION_set_cipher(tmpsess, cipher) - || !SSL_SESSION_set_protocol_version(tmpsess, SSL_version(ssl))) { - OPENSSL_free(key); - return 0; - } - OPENSSL_free(key); - *sess = tmpsess; - - return 1; -} - -#ifndef OPENSSL_NO_SRP -/* This is a context that we pass to callbacks */ -typedef struct srpsrvparm_st { - char *login; - SRP_VBASE *vb; - SRP_user_pwd *user; -} srpsrvparm; -static srpsrvparm srp_callback_parm; - -/* - * This callback pretends to require some asynchronous logic in order to - * obtain a verifier. When the callback is called for a new connection we - * return with a negative value. This will provoke the accept etc to return - * with an LOOKUP_X509. The main logic of the reinvokes the suspended call - * (which would normally occur after a worker has finished) and we set the - * user parameters. - */ -static int ssl_srp_server_param_cb(SSL *s, int *ad, void *arg) -{ - srpsrvparm *p = (srpsrvparm *) arg; - int ret = SSL3_AL_FATAL; - - if (p->login == NULL && p->user == NULL) { - p->login = SSL_get_srp_username(s); - BIO_printf(bio_err, "SRP username = \"%s\"\n", p->login); - return -1; - } - - if (p->user == NULL) { - BIO_printf(bio_err, "User %s doesn't exist\n", p->login); - goto err; - } - - if (SSL_set_srp_server_param - (s, p->user->N, p->user->g, p->user->s, p->user->v, - p->user->info) < 0) { - *ad = SSL_AD_INTERNAL_ERROR; - goto err; - } - BIO_printf(bio_err, - "SRP parameters set: username = \"%s\" info=\"%s\" \n", - p->login, p->user->info); - ret = SSL_ERROR_NONE; - - err: - SRP_user_pwd_free(p->user); - p->user = NULL; - p->login = NULL; - return ret; -} - -#endif - -static int local_argc = 0; -static char **local_argv; - -#ifdef CHARSET_EBCDIC -static int ebcdic_new(BIO *bi); -static int ebcdic_free(BIO *a); -static int ebcdic_read(BIO *b, char *out, int outl); -static int ebcdic_write(BIO *b, const char *in, int inl); -static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr); -static int ebcdic_gets(BIO *bp, char *buf, int size); -static int ebcdic_puts(BIO *bp, const char *str); - -# define BIO_TYPE_EBCDIC_FILTER (18|0x0200) -static BIO_METHOD *methods_ebcdic = NULL; - -/* This struct is "unwarranted chumminess with the compiler." */ -typedef struct { - size_t alloced; - char buff[1]; -} EBCDIC_OUTBUFF; - -static const BIO_METHOD *BIO_f_ebcdic_filter() -{ - if (methods_ebcdic == NULL) { - methods_ebcdic = BIO_meth_new(BIO_TYPE_EBCDIC_FILTER, - "EBCDIC/ASCII filter"); - if (methods_ebcdic == NULL - || !BIO_meth_set_write(methods_ebcdic, ebcdic_write) - || !BIO_meth_set_read(methods_ebcdic, ebcdic_read) - || !BIO_meth_set_puts(methods_ebcdic, ebcdic_puts) - || !BIO_meth_set_gets(methods_ebcdic, ebcdic_gets) - || !BIO_meth_set_ctrl(methods_ebcdic, ebcdic_ctrl) - || !BIO_meth_set_create(methods_ebcdic, ebcdic_new) - || !BIO_meth_set_destroy(methods_ebcdic, ebcdic_free)) - return NULL; - } - return methods_ebcdic; -} - -static int ebcdic_new(BIO *bi) -{ - EBCDIC_OUTBUFF *wbuf; - - wbuf = app_malloc(sizeof(*wbuf) + 1024, "ebcdic wbuf"); - wbuf->alloced = 1024; - wbuf->buff[0] = '\0'; - - BIO_set_data(bi, wbuf); - BIO_set_init(bi, 1); - return 1; -} - -static int ebcdic_free(BIO *a) -{ - EBCDIC_OUTBUFF *wbuf; - - if (a == NULL) - return 0; - wbuf = BIO_get_data(a); - OPENSSL_free(wbuf); - BIO_set_data(a, NULL); - BIO_set_init(a, 0); - - return 1; -} - -static int ebcdic_read(BIO *b, char *out, int outl) -{ - int ret = 0; - BIO *next = BIO_next(b); - - if (out == NULL || outl == 0) - return 0; - if (next == NULL) - return 0; - - ret = BIO_read(next, out, outl); - if (ret > 0) - ascii2ebcdic(out, out, ret); - return ret; -} - -static int ebcdic_write(BIO *b, const char *in, int inl) -{ - EBCDIC_OUTBUFF *wbuf; - BIO *next = BIO_next(b); - int ret = 0; - int num; - - if ((in == NULL) || (inl <= 0)) - return 0; - if (next == NULL) - return 0; - - wbuf = (EBCDIC_OUTBUFF *) BIO_get_data(b); - - if (inl > (num = wbuf->alloced)) { - num = num + num; /* double the size */ - if (num < inl) - num = inl; - OPENSSL_free(wbuf); - wbuf = app_malloc(sizeof(*wbuf) + num, "grow ebcdic wbuf"); - - wbuf->alloced = num; - wbuf->buff[0] = '\0'; - - BIO_set_data(b, wbuf); - } - - ebcdic2ascii(wbuf->buff, in, inl); - - ret = BIO_write(next, wbuf->buff, inl); - - return ret; -} - -static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr) -{ - long ret; - BIO *next = BIO_next(b); - - if (next == NULL) - return 0; - switch (cmd) { - case BIO_CTRL_DUP: - ret = 0L; - break; - default: - ret = BIO_ctrl(next, cmd, num, ptr); - break; - } - return ret; -} - -static int ebcdic_gets(BIO *bp, char *buf, int size) -{ - int i, ret = 0; - BIO *next = BIO_next(bp); - - if (next == NULL) - return 0; -/* return(BIO_gets(bp->next_bio,buf,size));*/ - for (i = 0; i < size - 1; ++i) { - ret = ebcdic_read(bp, &buf[i], 1); - if (ret <= 0) - break; - else if (buf[i] == '\n') { - ++i; - break; - } - } - if (i < size) - buf[i] = '\0'; - return (ret < 0 && i == 0) ? ret : i; -} - -static int ebcdic_puts(BIO *bp, const char *str) -{ - if (BIO_next(bp) == NULL) - return 0; - return ebcdic_write(bp, str, strlen(str)); -} -#endif - -/* This is a context that we pass to callbacks */ -typedef struct tlsextctx_st { - char *servername; - BIO *biodebug; - int extension_error; -} tlsextctx; - -static int ssl_servername_cb(SSL *s, int *ad, void *arg) -{ - tlsextctx *p = (tlsextctx *) arg; - const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name); - - if (servername != NULL && p->biodebug != NULL) { - const char *cp = servername; - unsigned char uc; - - BIO_printf(p->biodebug, "Hostname in TLS extension: \""); - while ((uc = *cp++) != 0) - BIO_printf(p->biodebug, - isascii(uc) && isprint(uc) ? "%c" : "\\x%02x", uc); - BIO_printf(p->biodebug, "\"\n"); - } - - if (p->servername == NULL) - return SSL_TLSEXT_ERR_NOACK; - - if (servername != NULL) { - if (strcasecmp(servername, p->servername)) - return p->extension_error; - if (ctx2 != NULL) { - BIO_printf(p->biodebug, "Switching server context.\n"); - SSL_set_SSL_CTX(s, ctx2); - } - } - return SSL_TLSEXT_ERR_OK; -} - -/* Structure passed to cert status callback */ -typedef struct tlsextstatusctx_st { - int timeout; - /* File to load OCSP Response from (or NULL if no file) */ - char *respin; - /* Default responder to use */ - char *host, *path, *port; - int use_ssl; - int verbose; -} tlsextstatusctx; - -static tlsextstatusctx tlscstatp = { -1 }; - -#ifndef OPENSSL_NO_OCSP - -/* - * Helper function to get an OCSP_RESPONSE from a responder. This is a - * simplified version. It examines certificates each time and makes one OCSP - * responder query for each request. A full version would store details such as - * the OCSP certificate IDs and minimise the number of OCSP responses by caching - * them until they were considered "expired". - */ -static int get_ocsp_resp_from_responder(SSL *s, tlsextstatusctx *srctx, - OCSP_RESPONSE **resp) -{ - char *host = NULL, *port = NULL, *path = NULL; - int use_ssl; - STACK_OF(OPENSSL_STRING) *aia = NULL; - X509 *x = NULL; - X509_STORE_CTX *inctx = NULL; - X509_OBJECT *obj; - OCSP_REQUEST *req = NULL; - OCSP_CERTID *id = NULL; - STACK_OF(X509_EXTENSION) *exts; - int ret = SSL_TLSEXT_ERR_NOACK; - int i; - - /* Build up OCSP query from server certificate */ - x = SSL_get_certificate(s); - aia = X509_get1_ocsp(x); - if (aia != NULL) { - if (!OCSP_parse_url(sk_OPENSSL_STRING_value(aia, 0), - &host, &port, &path, &use_ssl)) { - BIO_puts(bio_err, "cert_status: can't parse AIA URL\n"); - goto err; - } - if (srctx->verbose) - BIO_printf(bio_err, "cert_status: AIA URL: %s\n", - sk_OPENSSL_STRING_value(aia, 0)); - } else { - if (srctx->host == NULL) { - BIO_puts(bio_err, - "cert_status: no AIA and no default responder URL\n"); - goto done; - } - host = srctx->host; - path = srctx->path; - port = srctx->port; - use_ssl = srctx->use_ssl; - } - - inctx = X509_STORE_CTX_new(); - if (inctx == NULL) - goto err; - if (!X509_STORE_CTX_init(inctx, - SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)), - NULL, NULL)) - goto err; - obj = X509_STORE_CTX_get_obj_by_subject(inctx, X509_LU_X509, - X509_get_issuer_name(x)); - if (obj == NULL) { - BIO_puts(bio_err, "cert_status: Can't retrieve issuer certificate.\n"); - goto done; - } - id = OCSP_cert_to_id(NULL, x, X509_OBJECT_get0_X509(obj)); - X509_OBJECT_free(obj); - if (id == NULL) - goto err; - req = OCSP_REQUEST_new(); - if (req == NULL) - goto err; - if (!OCSP_request_add0_id(req, id)) - goto err; - id = NULL; - /* Add any extensions to the request */ - SSL_get_tlsext_status_exts(s, &exts); - for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) { - X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i); - if (!OCSP_REQUEST_add_ext(req, ext, -1)) - goto err; - } - *resp = process_responder(req, host, path, port, use_ssl, NULL, - srctx->timeout); - if (*resp == NULL) { - BIO_puts(bio_err, "cert_status: error querying responder\n"); - goto done; - } - - ret = SSL_TLSEXT_ERR_OK; - goto done; - - err: - ret = SSL_TLSEXT_ERR_ALERT_FATAL; - done: - /* - * If we parsed aia we need to free; otherwise they were copied and we - * don't - */ - if (aia != NULL) { - OPENSSL_free(host); - OPENSSL_free(path); - OPENSSL_free(port); - X509_email_free(aia); - } - OCSP_CERTID_free(id); - OCSP_REQUEST_free(req); - X509_STORE_CTX_free(inctx); - return ret; -} - -/* - * Certificate Status callback. This is called when a client includes a - * certificate status request extension. The response is either obtained from a - * file, or from an OCSP responder. - */ -static int cert_status_cb(SSL *s, void *arg) -{ - tlsextstatusctx *srctx = arg; - OCSP_RESPONSE *resp = NULL; - unsigned char *rspder = NULL; - int rspderlen; - int ret = SSL_TLSEXT_ERR_ALERT_FATAL; - - if (srctx->verbose) - BIO_puts(bio_err, "cert_status: callback called\n"); - - if (srctx->respin != NULL) { - BIO *derbio = bio_open_default(srctx->respin, 'r', FORMAT_ASN1); - if (derbio == NULL) { - BIO_puts(bio_err, "cert_status: Cannot open OCSP response file\n"); - goto err; - } - resp = d2i_OCSP_RESPONSE_bio(derbio, NULL); - BIO_free(derbio); - if (resp == NULL) { - BIO_puts(bio_err, "cert_status: Error reading OCSP response\n"); - goto err; - } - } else { - ret = get_ocsp_resp_from_responder(s, srctx, &resp); - if (ret != SSL_TLSEXT_ERR_OK) - goto err; - } - - rspderlen = i2d_OCSP_RESPONSE(resp, &rspder); - if (rspderlen <= 0) - goto err; - - SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen); - if (srctx->verbose) { - BIO_puts(bio_err, "cert_status: ocsp response sent:\n"); - OCSP_RESPONSE_print(bio_err, resp, 2); - } - - ret = SSL_TLSEXT_ERR_OK; - - err: - if (ret != SSL_TLSEXT_ERR_OK) - ERR_print_errors(bio_err); - - OCSP_RESPONSE_free(resp); - - return ret; -} -#endif - -#ifndef OPENSSL_NO_NEXTPROTONEG -/* This is the context that we pass to next_proto_cb */ -typedef struct tlsextnextprotoctx_st { - unsigned char *data; - size_t len; -} tlsextnextprotoctx; - -static int next_proto_cb(SSL *s, const unsigned char **data, - unsigned int *len, void *arg) -{ - tlsextnextprotoctx *next_proto = arg; - - *data = next_proto->data; - *len = next_proto->len; - - return SSL_TLSEXT_ERR_OK; -} -#endif /* ndef OPENSSL_NO_NEXTPROTONEG */ - -/* This the context that we pass to alpn_cb */ -typedef struct tlsextalpnctx_st { - unsigned char *data; - size_t len; -} tlsextalpnctx; - -static int alpn_cb(SSL *s, const unsigned char **out, unsigned char *outlen, - const unsigned char *in, unsigned int inlen, void *arg) -{ - tlsextalpnctx *alpn_ctx = arg; - - if (!s_quiet) { - /* We can assume that |in| is syntactically valid. */ - unsigned int i; - BIO_printf(bio_s_out, "ALPN protocols advertised by the client: "); - for (i = 0; i < inlen;) { - if (i) - BIO_write(bio_s_out, ", ", 2); - BIO_write(bio_s_out, &in[i + 1], in[i]); - i += in[i] + 1; - } - BIO_write(bio_s_out, "\n", 1); - } - - if (SSL_select_next_proto - ((unsigned char **)out, outlen, alpn_ctx->data, alpn_ctx->len, in, - inlen) != OPENSSL_NPN_NEGOTIATED) { - return SSL_TLSEXT_ERR_NOACK; - } - - if (!s_quiet) { - BIO_printf(bio_s_out, "ALPN protocols selected: "); - BIO_write(bio_s_out, *out, *outlen); - BIO_write(bio_s_out, "\n", 1); - } - - return SSL_TLSEXT_ERR_OK; -} - -static int not_resumable_sess_cb(SSL *s, int is_forward_secure) -{ - /* disable resumption for sessions with forward secure ciphers */ - return is_forward_secure; -} - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ENGINE, - OPT_4, OPT_6, OPT_ACCEPT, OPT_PORT, OPT_UNIX, OPT_UNLINK, OPT_NACCEPT, - OPT_VERIFY, OPT_NAMEOPT, OPT_UPPER_V_VERIFY, OPT_CONTEXT, OPT_CERT, OPT_CRL, - OPT_CRL_DOWNLOAD, OPT_SERVERINFO, OPT_CERTFORM, OPT_KEY, OPT_KEYFORM, - OPT_PASS, OPT_CERT_CHAIN, OPT_DHPARAM, OPT_DCERTFORM, OPT_DCERT, - OPT_DKEYFORM, OPT_DPASS, OPT_DKEY, OPT_DCERT_CHAIN, OPT_NOCERT, - OPT_CAPATH, OPT_NOCAPATH, OPT_CHAINCAPATH, OPT_VERIFYCAPATH, OPT_NO_CACHE, - OPT_EXT_CACHE, OPT_CRLFORM, OPT_VERIFY_RET_ERROR, OPT_VERIFY_QUIET, - OPT_BUILD_CHAIN, OPT_CAFILE, OPT_NOCAFILE, OPT_CHAINCAFILE, - OPT_VERIFYCAFILE, OPT_NBIO, OPT_NBIO_TEST, OPT_IGN_EOF, OPT_NO_IGN_EOF, - OPT_DEBUG, OPT_TLSEXTDEBUG, OPT_STATUS, OPT_STATUS_VERBOSE, - OPT_STATUS_TIMEOUT, OPT_STATUS_URL, OPT_STATUS_FILE, OPT_MSG, OPT_MSGFILE, - OPT_TRACE, OPT_SECURITY_DEBUG, OPT_SECURITY_DEBUG_VERBOSE, OPT_STATE, - OPT_CRLF, OPT_QUIET, OPT_BRIEF, OPT_NO_DHE, - OPT_NO_RESUME_EPHEMERAL, OPT_PSK_IDENTITY, OPT_PSK_HINT, OPT_PSK, - OPT_PSK_SESS, OPT_SRPVFILE, OPT_SRPUSERSEED, OPT_REV, OPT_WWW, - OPT_UPPER_WWW, OPT_HTTP, OPT_ASYNC, OPT_SSL_CONFIG, - OPT_MAX_SEND_FRAG, OPT_SPLIT_SEND_FRAG, OPT_MAX_PIPELINES, OPT_READ_BUF, - OPT_SSL3, OPT_TLS1_3, OPT_TLS1_2, OPT_TLS1_1, OPT_TLS1, OPT_DTLS, OPT_DTLS1, - OPT_DTLS1_2, OPT_SCTP, OPT_TIMEOUT, OPT_MTU, OPT_LISTEN, OPT_STATELESS, - OPT_ID_PREFIX, OPT_SERVERNAME, OPT_SERVERNAME_FATAL, - OPT_CERT2, OPT_KEY2, OPT_NEXTPROTONEG, OPT_ALPN, - OPT_SRTP_PROFILES, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN, - OPT_KEYLOG_FILE, OPT_MAX_EARLY, OPT_RECV_MAX_EARLY, OPT_EARLY_DATA, - OPT_S_NUM_TICKETS, OPT_ANTI_REPLAY, OPT_NO_ANTI_REPLAY, OPT_SCTP_LABEL_BUG, - OPT_R_ENUM, - OPT_S_ENUM, - OPT_V_ENUM, - OPT_X_ENUM -} OPTION_CHOICE; - -const OPTIONS s_server_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"port", OPT_PORT, 'p', - "TCP/IP port to listen on for connections (default is " PORT ")"}, - {"accept", OPT_ACCEPT, 's', - "TCP/IP optional host and port to listen on for connections (default is *:" PORT ")"}, -#ifdef AF_UNIX - {"unix", OPT_UNIX, 's', "Unix domain socket to accept on"}, -#endif - {"4", OPT_4, '-', "Use IPv4 only"}, - {"6", OPT_6, '-', "Use IPv6 only"}, -#ifdef AF_UNIX - {"unlink", OPT_UNLINK, '-', "For -unix, unlink existing socket first"}, -#endif - {"context", OPT_CONTEXT, 's', "Set session ID context"}, - {"verify", OPT_VERIFY, 'n', "Turn on peer certificate verification"}, - {"Verify", OPT_UPPER_V_VERIFY, 'n', - "Turn on peer certificate verification, must have a cert"}, - {"cert", OPT_CERT, '<', "Certificate file to use; default is " TEST_CERT}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - {"naccept", OPT_NACCEPT, 'p', "Terminate after #num connections"}, - {"serverinfo", OPT_SERVERINFO, 's', - "PEM serverinfo file for certificate"}, - {"certform", OPT_CERTFORM, 'F', - "Certificate format (PEM or DER) PEM default"}, - {"key", OPT_KEY, 's', - "Private Key if not in -cert; default is " TEST_CERT}, - {"keyform", OPT_KEYFORM, 'f', - "Key format (PEM, DER or ENGINE) PEM default"}, - {"pass", OPT_PASS, 's', "Private key file pass phrase source"}, - {"dcert", OPT_DCERT, '<', - "Second certificate file to use (usually for DSA)"}, - {"dhparam", OPT_DHPARAM, '<', "DH parameters file to use"}, - {"dcertform", OPT_DCERTFORM, 'F', - "Second certificate format (PEM or DER) PEM default"}, - {"dkey", OPT_DKEY, '<', - "Second private key file to use (usually for DSA)"}, - {"dkeyform", OPT_DKEYFORM, 'F', - "Second key format (PEM, DER or ENGINE) PEM default"}, - {"dpass", OPT_DPASS, 's', "Second private key file pass phrase source"}, - {"nbio_test", OPT_NBIO_TEST, '-', "Test with the non-blocking test bio"}, - {"crlf", OPT_CRLF, '-', "Convert LF from terminal into CRLF"}, - {"debug", OPT_DEBUG, '-', "Print more output"}, - {"msg", OPT_MSG, '-', "Show protocol messages"}, - {"msgfile", OPT_MSGFILE, '>', - "File to send output of -msg or -trace, instead of stdout"}, - {"state", OPT_STATE, '-', "Print the SSL states"}, - {"CAfile", OPT_CAFILE, '<', "PEM format file of CA's"}, - {"CApath", OPT_CAPATH, '/', "PEM format directory of CA's"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"nocert", OPT_NOCERT, '-', "Don't use any certificates (Anon-DH)"}, - {"quiet", OPT_QUIET, '-', "No server output"}, - {"no_resume_ephemeral", OPT_NO_RESUME_EPHEMERAL, '-', - "Disable caching and tickets if ephemeral (EC)DH is used"}, - {"www", OPT_WWW, '-', "Respond to a 'GET /' with a status page"}, - {"WWW", OPT_UPPER_WWW, '-', "Respond to a 'GET with the file ./path"}, - {"servername", OPT_SERVERNAME, 's', - "Servername for HostName TLS extension"}, - {"servername_fatal", OPT_SERVERNAME_FATAL, '-', - "mismatch send fatal alert (default warning alert)"}, - {"cert2", OPT_CERT2, '<', - "Certificate file to use for servername; default is" TEST_CERT2}, - {"key2", OPT_KEY2, '<', - "-Private Key file to use for servername if not in -cert2"}, - {"tlsextdebug", OPT_TLSEXTDEBUG, '-', - "Hex dump of all TLS extensions received"}, - {"HTTP", OPT_HTTP, '-', "Like -WWW but ./path includes HTTP headers"}, - {"id_prefix", OPT_ID_PREFIX, 's', - "Generate SSL/TLS session IDs prefixed by arg"}, - OPT_R_OPTIONS, - {"keymatexport", OPT_KEYMATEXPORT, 's', - "Export keying material using label"}, - {"keymatexportlen", OPT_KEYMATEXPORTLEN, 'p', - "Export len bytes of keying material (default 20)"}, - {"CRL", OPT_CRL, '<', "CRL file to use"}, - {"crl_download", OPT_CRL_DOWNLOAD, '-', - "Download CRL from distribution points"}, - {"cert_chain", OPT_CERT_CHAIN, '<', - "certificate chain file in PEM format"}, - {"dcert_chain", OPT_DCERT_CHAIN, '<', - "second certificate chain file in PEM format"}, - {"chainCApath", OPT_CHAINCAPATH, '/', - "use dir as certificate store path to build CA certificate chain"}, - {"verifyCApath", OPT_VERIFYCAPATH, '/', - "use dir as certificate store path to verify CA certificate"}, - {"no_cache", OPT_NO_CACHE, '-', "Disable session cache"}, - {"ext_cache", OPT_EXT_CACHE, '-', - "Disable internal cache, setup and use external cache"}, - {"CRLform", OPT_CRLFORM, 'F', "CRL format (PEM or DER) PEM is default"}, - {"verify_return_error", OPT_VERIFY_RET_ERROR, '-', - "Close connection on verification error"}, - {"verify_quiet", OPT_VERIFY_QUIET, '-', - "No verify output except verify errors"}, - {"build_chain", OPT_BUILD_CHAIN, '-', "Build certificate chain"}, - {"chainCAfile", OPT_CHAINCAFILE, '<', - "CA file for certificate chain (PEM format)"}, - {"verifyCAfile", OPT_VERIFYCAFILE, '<', - "CA file for certificate verification (PEM format)"}, - {"ign_eof", OPT_IGN_EOF, '-', "ignore input eof (default when -quiet)"}, - {"no_ign_eof", OPT_NO_IGN_EOF, '-', "Do not ignore input eof"}, -#ifndef OPENSSL_NO_OCSP - {"status", OPT_STATUS, '-', "Request certificate status from server"}, - {"status_verbose", OPT_STATUS_VERBOSE, '-', - "Print more output in certificate status callback"}, - {"status_timeout", OPT_STATUS_TIMEOUT, 'n', - "Status request responder timeout"}, - {"status_url", OPT_STATUS_URL, 's', "Status request fallback URL"}, - {"status_file", OPT_STATUS_FILE, '<', - "File containing DER encoded OCSP Response"}, -#endif -#ifndef OPENSSL_NO_SSL_TRACE - {"trace", OPT_TRACE, '-', "trace protocol messages"}, -#endif - {"security_debug", OPT_SECURITY_DEBUG, '-', - "Print output from SSL/TLS security framework"}, - {"security_debug_verbose", OPT_SECURITY_DEBUG_VERBOSE, '-', - "Print more output from SSL/TLS security framework"}, - {"brief", OPT_BRIEF, '-', - "Restrict output to brief summary of connection parameters"}, - {"rev", OPT_REV, '-', - "act as a simple test server which just sends back with the received text reversed"}, - {"async", OPT_ASYNC, '-', "Operate in asynchronous mode"}, - {"ssl_config", OPT_SSL_CONFIG, 's', - "Configure SSL_CTX using the configuration 'val'"}, - {"max_send_frag", OPT_MAX_SEND_FRAG, 'p', "Maximum Size of send frames "}, - {"split_send_frag", OPT_SPLIT_SEND_FRAG, 'p', - "Size used to split data for encrypt pipelines"}, - {"max_pipelines", OPT_MAX_PIPELINES, 'p', - "Maximum number of encrypt/decrypt pipelines to be used"}, - {"read_buf", OPT_READ_BUF, 'p', - "Default read buffer size to be used for connections"}, - OPT_S_OPTIONS, - OPT_V_OPTIONS, - OPT_X_OPTIONS, - {"nbio", OPT_NBIO, '-', "Use non-blocking IO"}, - {"psk_identity", OPT_PSK_IDENTITY, 's', "PSK identity to expect"}, -#ifndef OPENSSL_NO_PSK - {"psk_hint", OPT_PSK_HINT, 's', "PSK identity hint to use"}, -#endif - {"psk", OPT_PSK, 's', "PSK in hex (without 0x)"}, - {"psk_session", OPT_PSK_SESS, '<', "File to read PSK SSL session from"}, -#ifndef OPENSSL_NO_SRP - {"srpvfile", OPT_SRPVFILE, '<', "The verifier file for SRP"}, - {"srpuserseed", OPT_SRPUSERSEED, 's', - "A seed string for a default user salt"}, -#endif -#ifndef OPENSSL_NO_SSL3 - {"ssl3", OPT_SSL3, '-', "Just talk SSLv3"}, -#endif -#ifndef OPENSSL_NO_TLS1 - {"tls1", OPT_TLS1, '-', "Just talk TLSv1"}, -#endif -#ifndef OPENSSL_NO_TLS1_1 - {"tls1_1", OPT_TLS1_1, '-', "Just talk TLSv1.1"}, -#endif -#ifndef OPENSSL_NO_TLS1_2 - {"tls1_2", OPT_TLS1_2, '-', "just talk TLSv1.2"}, -#endif -#ifndef OPENSSL_NO_TLS1_3 - {"tls1_3", OPT_TLS1_3, '-', "just talk TLSv1.3"}, -#endif -#ifndef OPENSSL_NO_DTLS - {"dtls", OPT_DTLS, '-', "Use any DTLS version"}, - {"timeout", OPT_TIMEOUT, '-', "Enable timeouts"}, - {"mtu", OPT_MTU, 'p', "Set link layer MTU"}, - {"listen", OPT_LISTEN, '-', - "Listen for a DTLS ClientHello with a cookie and then connect"}, -#endif - {"stateless", OPT_STATELESS, '-', "Require TLSv1.3 cookies"}, -#ifndef OPENSSL_NO_DTLS1 - {"dtls1", OPT_DTLS1, '-', "Just talk DTLSv1"}, -#endif -#ifndef OPENSSL_NO_DTLS1_2 - {"dtls1_2", OPT_DTLS1_2, '-', "Just talk DTLSv1.2"}, -#endif -#ifndef OPENSSL_NO_SCTP - {"sctp", OPT_SCTP, '-', "Use SCTP"}, - {"sctp_label_bug", OPT_SCTP_LABEL_BUG, '-', "Enable SCTP label length bug"}, -#endif -#ifndef OPENSSL_NO_DH - {"no_dhe", OPT_NO_DHE, '-', "Disable ephemeral DH"}, -#endif -#ifndef OPENSSL_NO_NEXTPROTONEG - {"nextprotoneg", OPT_NEXTPROTONEG, 's', - "Set the advertised protocols for the NPN extension (comma-separated list)"}, -#endif -#ifndef OPENSSL_NO_SRTP - {"use_srtp", OPT_SRTP_PROFILES, 's', - "Offer SRTP key management with a colon-separated profile list"}, -#endif - {"alpn", OPT_ALPN, 's', - "Set the advertised protocols for the ALPN extension (comma-separated list)"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"keylogfile", OPT_KEYLOG_FILE, '>', "Write TLS secrets to file"}, - {"max_early_data", OPT_MAX_EARLY, 'n', - "The maximum number of bytes of early data as advertised in tickets"}, - {"recv_max_early_data", OPT_RECV_MAX_EARLY, 'n', - "The maximum number of bytes of early data (hard limit)"}, - {"early_data", OPT_EARLY_DATA, '-', "Attempt to read early data"}, - {"num_tickets", OPT_S_NUM_TICKETS, 'n', - "The number of TLSv1.3 session tickets that a server will automatically issue" }, - {"anti_replay", OPT_ANTI_REPLAY, '-', "Switch on anti-replay protection (default)"}, - {"no_anti_replay", OPT_NO_ANTI_REPLAY, '-', "Switch off anti-replay protection"}, - {NULL, OPT_EOF, 0, NULL} -}; - -#define IS_PROT_FLAG(o) \ - (o == OPT_SSL3 || o == OPT_TLS1 || o == OPT_TLS1_1 || o == OPT_TLS1_2 \ - || o == OPT_TLS1_3 || o == OPT_DTLS || o == OPT_DTLS1 || o == OPT_DTLS1_2) - -int s_server_main(int argc, char *argv[]) -{ - ENGINE *engine = NULL; - EVP_PKEY *s_key = NULL, *s_dkey = NULL; - SSL_CONF_CTX *cctx = NULL; - const SSL_METHOD *meth = TLS_server_method(); - SSL_EXCERT *exc = NULL; - STACK_OF(OPENSSL_STRING) *ssl_args = NULL; - STACK_OF(X509) *s_chain = NULL, *s_dchain = NULL; - STACK_OF(X509_CRL) *crls = NULL; - X509 *s_cert = NULL, *s_dcert = NULL; - X509_VERIFY_PARAM *vpm = NULL; - const char *CApath = NULL, *CAfile = NULL, *chCApath = NULL, *chCAfile = NULL; - char *dpassarg = NULL, *dpass = NULL; - char *passarg = NULL, *pass = NULL, *vfyCApath = NULL, *vfyCAfile = NULL; - char *crl_file = NULL, *prog; -#ifdef AF_UNIX - int unlink_unix_path = 0; -#endif - do_server_cb server_cb; - int vpmtouched = 0, build_chain = 0, no_cache = 0, ext_cache = 0; -#ifndef OPENSSL_NO_DH - char *dhfile = NULL; - int no_dhe = 0; -#endif - int nocert = 0, ret = 1; - int noCApath = 0, noCAfile = 0; - int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM; - int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM; - int rev = 0, naccept = -1, sdebug = 0; - int socket_family = AF_UNSPEC, socket_type = SOCK_STREAM, protocol = 0; - int state = 0, crl_format = FORMAT_PEM, crl_download = 0; - char *host = NULL; - char *port = BUF_strdup(PORT); - unsigned char *context = NULL; - OPTION_CHOICE o; - EVP_PKEY *s_key2 = NULL; - X509 *s_cert2 = NULL; - tlsextctx tlsextcbp = { NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING }; - const char *ssl_config = NULL; - int read_buf_len = 0; -#ifndef OPENSSL_NO_NEXTPROTONEG - const char *next_proto_neg_in = NULL; - tlsextnextprotoctx next_proto = { NULL, 0 }; -#endif - const char *alpn_in = NULL; - tlsextalpnctx alpn_ctx = { NULL, 0 }; -#ifndef OPENSSL_NO_PSK - /* by default do not send a PSK identity hint */ - char *psk_identity_hint = NULL; -#endif - char *p; -#ifndef OPENSSL_NO_SRP - char *srpuserseed = NULL; - char *srp_verifier_file = NULL; -#endif -#ifndef OPENSSL_NO_SRTP - char *srtp_profiles = NULL; -#endif - int min_version = 0, max_version = 0, prot_opt = 0, no_prot_opt = 0; - int s_server_verify = SSL_VERIFY_NONE; - int s_server_session_id_context = 1; /* anything will do */ - const char *s_cert_file = TEST_CERT, *s_key_file = NULL, *s_chain_file = NULL; - const char *s_cert_file2 = TEST_CERT2, *s_key_file2 = NULL; - char *s_dcert_file = NULL, *s_dkey_file = NULL, *s_dchain_file = NULL; -#ifndef OPENSSL_NO_OCSP - int s_tlsextstatus = 0; -#endif - int no_resume_ephemeral = 0; - unsigned int max_send_fragment = 0; - unsigned int split_send_fragment = 0, max_pipelines = 0; - const char *s_serverinfo_file = NULL; - const char *keylog_file = NULL; - int max_early_data = -1, recv_max_early_data = -1; - char *psksessf = NULL; -#ifndef OPENSSL_NO_SCTP - int sctp_label_bug = 0; -#endif - - /* Init of few remaining global variables */ - local_argc = argc; - local_argv = argv; - - ctx = ctx2 = NULL; - s_nbio = s_nbio_test = 0; - www = 0; - bio_s_out = NULL; - s_debug = 0; - s_msg = 0; - s_quiet = 0; - s_brief = 0; - async = 0; - - cctx = SSL_CONF_CTX_new(); - vpm = X509_VERIFY_PARAM_new(); - if (cctx == NULL || vpm == NULL) - goto end; - SSL_CONF_CTX_set_flags(cctx, - SSL_CONF_FLAG_SERVER | SSL_CONF_FLAG_CMDLINE); - - prog = opt_init(argc, argv, s_server_options); - while ((o = opt_next()) != OPT_EOF) { - if (IS_PROT_FLAG(o) && ++prot_opt > 1) { - BIO_printf(bio_err, "Cannot supply multiple protocol flags\n"); - goto end; - } - if (IS_NO_PROT_FLAG(o)) - no_prot_opt++; - if (prot_opt == 1 && no_prot_opt) { - BIO_printf(bio_err, - "Cannot supply both a protocol flag and '-no_<prot>'\n"); - goto end; - } - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(s_server_options); - ret = 0; - goto end; - - case OPT_4: -#ifdef AF_UNIX - if (socket_family == AF_UNIX) { - OPENSSL_free(host); host = NULL; - OPENSSL_free(port); port = NULL; - } -#endif - socket_family = AF_INET; - break; - case OPT_6: - if (1) { -#ifdef AF_INET6 -#ifdef AF_UNIX - if (socket_family == AF_UNIX) { - OPENSSL_free(host); host = NULL; - OPENSSL_free(port); port = NULL; - } -#endif - socket_family = AF_INET6; - } else { -#endif - BIO_printf(bio_err, "%s: IPv6 domain sockets unsupported\n", prog); - goto end; - } - break; - case OPT_PORT: -#ifdef AF_UNIX - if (socket_family == AF_UNIX) { - socket_family = AF_UNSPEC; - } -#endif - OPENSSL_free(port); port = NULL; - OPENSSL_free(host); host = NULL; - if (BIO_parse_hostserv(opt_arg(), NULL, &port, BIO_PARSE_PRIO_SERV) < 1) { - BIO_printf(bio_err, - "%s: -port argument malformed or ambiguous\n", - port); - goto end; - } - break; - case OPT_ACCEPT: -#ifdef AF_UNIX - if (socket_family == AF_UNIX) { - socket_family = AF_UNSPEC; - } -#endif - OPENSSL_free(port); port = NULL; - OPENSSL_free(host); host = NULL; - if (BIO_parse_hostserv(opt_arg(), &host, &port, BIO_PARSE_PRIO_SERV) < 1) { - BIO_printf(bio_err, - "%s: -accept argument malformed or ambiguous\n", - port); - goto end; - } - break; -#ifdef AF_UNIX - case OPT_UNIX: - socket_family = AF_UNIX; - OPENSSL_free(host); host = BUF_strdup(opt_arg()); - OPENSSL_free(port); port = NULL; - break; - case OPT_UNLINK: - unlink_unix_path = 1; - break; -#endif - case OPT_NACCEPT: - naccept = atol(opt_arg()); - break; - case OPT_VERIFY: - s_server_verify = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE; - verify_args.depth = atoi(opt_arg()); - if (!s_quiet) - BIO_printf(bio_err, "verify depth is %d\n", verify_args.depth); - break; - case OPT_UPPER_V_VERIFY: - s_server_verify = - SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT | - SSL_VERIFY_CLIENT_ONCE; - verify_args.depth = atoi(opt_arg()); - if (!s_quiet) - BIO_printf(bio_err, - "verify depth is %d, must return a certificate\n", - verify_args.depth); - break; - case OPT_CONTEXT: - context = (unsigned char *)opt_arg(); - break; - case OPT_CERT: - s_cert_file = opt_arg(); - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto end; - break; - case OPT_CRL: - crl_file = opt_arg(); - break; - case OPT_CRL_DOWNLOAD: - crl_download = 1; - break; - case OPT_SERVERINFO: - s_serverinfo_file = opt_arg(); - break; - case OPT_CERTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &s_cert_format)) - goto opthelp; - break; - case OPT_KEY: - s_key_file = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &s_key_format)) - goto opthelp; - break; - case OPT_PASS: - passarg = opt_arg(); - break; - case OPT_CERT_CHAIN: - s_chain_file = opt_arg(); - break; - case OPT_DHPARAM: -#ifndef OPENSSL_NO_DH - dhfile = opt_arg(); -#endif - break; - case OPT_DCERTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &s_dcert_format)) - goto opthelp; - break; - case OPT_DCERT: - s_dcert_file = opt_arg(); - break; - case OPT_DKEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &s_dkey_format)) - goto opthelp; - break; - case OPT_DPASS: - dpassarg = opt_arg(); - break; - case OPT_DKEY: - s_dkey_file = opt_arg(); - break; - case OPT_DCERT_CHAIN: - s_dchain_file = opt_arg(); - break; - case OPT_NOCERT: - nocert = 1; - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_CHAINCAPATH: - chCApath = opt_arg(); - break; - case OPT_VERIFYCAPATH: - vfyCApath = opt_arg(); - break; - case OPT_NO_CACHE: - no_cache = 1; - break; - case OPT_EXT_CACHE: - ext_cache = 1; - break; - case OPT_CRLFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &crl_format)) - goto opthelp; - break; - case OPT_S_CASES: - case OPT_S_NUM_TICKETS: - case OPT_ANTI_REPLAY: - case OPT_NO_ANTI_REPLAY: - if (ssl_args == NULL) - ssl_args = sk_OPENSSL_STRING_new_null(); - if (ssl_args == NULL - || !sk_OPENSSL_STRING_push(ssl_args, opt_flag()) - || !sk_OPENSSL_STRING_push(ssl_args, opt_arg())) { - BIO_printf(bio_err, "%s: Memory allocation failure\n", prog); - goto end; - } - break; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto end; - vpmtouched++; - break; - case OPT_X_CASES: - if (!args_excert(o, &exc)) - goto end; - break; - case OPT_VERIFY_RET_ERROR: - verify_args.return_error = 1; - break; - case OPT_VERIFY_QUIET: - verify_args.quiet = 1; - break; - case OPT_BUILD_CHAIN: - build_chain = 1; - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_CHAINCAFILE: - chCAfile = opt_arg(); - break; - case OPT_VERIFYCAFILE: - vfyCAfile = opt_arg(); - break; - case OPT_NBIO: - s_nbio = 1; - break; - case OPT_NBIO_TEST: - s_nbio = s_nbio_test = 1; - break; - case OPT_IGN_EOF: - s_ign_eof = 1; - break; - case OPT_NO_IGN_EOF: - s_ign_eof = 0; - break; - case OPT_DEBUG: - s_debug = 1; - break; - case OPT_TLSEXTDEBUG: - s_tlsextdebug = 1; - break; - case OPT_STATUS: -#ifndef OPENSSL_NO_OCSP - s_tlsextstatus = 1; -#endif - break; - case OPT_STATUS_VERBOSE: -#ifndef OPENSSL_NO_OCSP - s_tlsextstatus = tlscstatp.verbose = 1; -#endif - break; - case OPT_STATUS_TIMEOUT: -#ifndef OPENSSL_NO_OCSP - s_tlsextstatus = 1; - tlscstatp.timeout = atoi(opt_arg()); -#endif - break; - case OPT_STATUS_URL: -#ifndef OPENSSL_NO_OCSP - s_tlsextstatus = 1; - if (!OCSP_parse_url(opt_arg(), - &tlscstatp.host, - &tlscstatp.port, - &tlscstatp.path, &tlscstatp.use_ssl)) { - BIO_printf(bio_err, "Error parsing URL\n"); - goto end; - } -#endif - break; - case OPT_STATUS_FILE: -#ifndef OPENSSL_NO_OCSP - s_tlsextstatus = 1; - tlscstatp.respin = opt_arg(); -#endif - break; - case OPT_MSG: - s_msg = 1; - break; - case OPT_MSGFILE: - bio_s_msg = BIO_new_file(opt_arg(), "w"); - break; - case OPT_TRACE: -#ifndef OPENSSL_NO_SSL_TRACE - s_msg = 2; -#endif - break; - case OPT_SECURITY_DEBUG: - sdebug = 1; - break; - case OPT_SECURITY_DEBUG_VERBOSE: - sdebug = 2; - break; - case OPT_STATE: - state = 1; - break; - case OPT_CRLF: - s_crlf = 1; - break; - case OPT_QUIET: - s_quiet = 1; - break; - case OPT_BRIEF: - s_quiet = s_brief = verify_args.quiet = 1; - break; - case OPT_NO_DHE: -#ifndef OPENSSL_NO_DH - no_dhe = 1; -#endif - break; - case OPT_NO_RESUME_EPHEMERAL: - no_resume_ephemeral = 1; - break; - case OPT_PSK_IDENTITY: - psk_identity = opt_arg(); - break; - case OPT_PSK_HINT: -#ifndef OPENSSL_NO_PSK - psk_identity_hint = opt_arg(); -#endif - break; - case OPT_PSK: - for (p = psk_key = opt_arg(); *p; p++) { - if (isxdigit(_UC(*p))) - continue; - BIO_printf(bio_err, "Not a hex number '%s'\n", psk_key); - goto end; - } - break; - case OPT_PSK_SESS: - psksessf = opt_arg(); - break; - case OPT_SRPVFILE: -#ifndef OPENSSL_NO_SRP - srp_verifier_file = opt_arg(); - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; -#endif - break; - case OPT_SRPUSERSEED: -#ifndef OPENSSL_NO_SRP - srpuserseed = opt_arg(); - if (min_version < TLS1_VERSION) - min_version = TLS1_VERSION; -#endif - break; - case OPT_REV: - rev = 1; - break; - case OPT_WWW: - www = 1; - break; - case OPT_UPPER_WWW: - www = 2; - break; - case OPT_HTTP: - www = 3; - break; - case OPT_SSL_CONFIG: - ssl_config = opt_arg(); - break; - case OPT_SSL3: - min_version = SSL3_VERSION; - max_version = SSL3_VERSION; - break; - case OPT_TLS1_3: - min_version = TLS1_3_VERSION; - max_version = TLS1_3_VERSION; - break; - case OPT_TLS1_2: - min_version = TLS1_2_VERSION; - max_version = TLS1_2_VERSION; - break; - case OPT_TLS1_1: - min_version = TLS1_1_VERSION; - max_version = TLS1_1_VERSION; - break; - case OPT_TLS1: - min_version = TLS1_VERSION; - max_version = TLS1_VERSION; - break; - case OPT_DTLS: -#ifndef OPENSSL_NO_DTLS - meth = DTLS_server_method(); - socket_type = SOCK_DGRAM; -#endif - break; - case OPT_DTLS1: -#ifndef OPENSSL_NO_DTLS - meth = DTLS_server_method(); - min_version = DTLS1_VERSION; - max_version = DTLS1_VERSION; - socket_type = SOCK_DGRAM; -#endif - break; - case OPT_DTLS1_2: -#ifndef OPENSSL_NO_DTLS - meth = DTLS_server_method(); - min_version = DTLS1_2_VERSION; - max_version = DTLS1_2_VERSION; - socket_type = SOCK_DGRAM; -#endif - break; - case OPT_SCTP: -#ifndef OPENSSL_NO_SCTP - protocol = IPPROTO_SCTP; -#endif - break; - case OPT_SCTP_LABEL_BUG: -#ifndef OPENSSL_NO_SCTP - sctp_label_bug = 1; -#endif - break; - case OPT_TIMEOUT: -#ifndef OPENSSL_NO_DTLS - enable_timeouts = 1; -#endif - break; - case OPT_MTU: -#ifndef OPENSSL_NO_DTLS - socket_mtu = atol(opt_arg()); -#endif - break; - case OPT_LISTEN: -#ifndef OPENSSL_NO_DTLS - dtlslisten = 1; -#endif - break; - case OPT_STATELESS: - stateless = 1; - break; - case OPT_ID_PREFIX: - session_id_prefix = opt_arg(); - break; - case OPT_ENGINE: - engine = setup_engine(opt_arg(), 1); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_SERVERNAME: - tlsextcbp.servername = opt_arg(); - break; - case OPT_SERVERNAME_FATAL: - tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL; - break; - case OPT_CERT2: - s_cert_file2 = opt_arg(); - break; - case OPT_KEY2: - s_key_file2 = opt_arg(); - break; - case OPT_NEXTPROTONEG: -# ifndef OPENSSL_NO_NEXTPROTONEG - next_proto_neg_in = opt_arg(); -#endif - break; - case OPT_ALPN: - alpn_in = opt_arg(); - break; - case OPT_SRTP_PROFILES: -#ifndef OPENSSL_NO_SRTP - srtp_profiles = opt_arg(); -#endif - break; - case OPT_KEYMATEXPORT: - keymatexportlabel = opt_arg(); - break; - case OPT_KEYMATEXPORTLEN: - keymatexportlen = atoi(opt_arg()); - break; - case OPT_ASYNC: - async = 1; - break; - case OPT_MAX_SEND_FRAG: - max_send_fragment = atoi(opt_arg()); - break; - case OPT_SPLIT_SEND_FRAG: - split_send_fragment = atoi(opt_arg()); - break; - case OPT_MAX_PIPELINES: - max_pipelines = atoi(opt_arg()); - break; - case OPT_READ_BUF: - read_buf_len = atoi(opt_arg()); - break; - case OPT_KEYLOG_FILE: - keylog_file = opt_arg(); - break; - case OPT_MAX_EARLY: - max_early_data = atoi(opt_arg()); - if (max_early_data < 0) { - BIO_printf(bio_err, "Invalid value for max_early_data\n"); - goto end; - } - break; - case OPT_RECV_MAX_EARLY: - recv_max_early_data = atoi(opt_arg()); - if (recv_max_early_data < 0) { - BIO_printf(bio_err, "Invalid value for recv_max_early_data\n"); - goto end; - } - break; - case OPT_EARLY_DATA: - early_data = 1; - if (max_early_data == -1) - max_early_data = SSL3_RT_MAX_PLAIN_LENGTH; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - -#ifndef OPENSSL_NO_NEXTPROTONEG - if (min_version == TLS1_3_VERSION && next_proto_neg_in != NULL) { - BIO_printf(bio_err, "Cannot supply -nextprotoneg with TLSv1.3\n"); - goto opthelp; - } -#endif -#ifndef OPENSSL_NO_DTLS - if (www && socket_type == SOCK_DGRAM) { - BIO_printf(bio_err, "Can't use -HTTP, -www or -WWW with DTLS\n"); - goto end; - } - - if (dtlslisten && socket_type != SOCK_DGRAM) { - BIO_printf(bio_err, "Can only use -listen with DTLS\n"); - goto end; - } -#endif - - if (stateless && socket_type != SOCK_STREAM) { - BIO_printf(bio_err, "Can only use --stateless with TLS\n"); - goto end; - } - -#ifdef AF_UNIX - if (socket_family == AF_UNIX && socket_type != SOCK_STREAM) { - BIO_printf(bio_err, - "Can't use unix sockets and datagrams together\n"); - goto end; - } -#endif - if (early_data && (www > 0 || rev)) { - BIO_printf(bio_err, - "Can't use -early_data in combination with -www, -WWW, -HTTP, or -rev\n"); - goto end; - } - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP) { - if (socket_type != SOCK_DGRAM) { - BIO_printf(bio_err, "Can't use -sctp without DTLS\n"); - goto end; - } - /* SCTP is unusual. It uses DTLS over a SOCK_STREAM protocol */ - socket_type = SOCK_STREAM; - } -#endif - - if (!app_passwd(passarg, dpassarg, &pass, &dpass)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - if (s_key_file == NULL) - s_key_file = s_cert_file; - - if (s_key_file2 == NULL) - s_key_file2 = s_cert_file2; - - if (!load_excert(&exc)) - goto end; - - if (nocert == 0) { - s_key = load_key(s_key_file, s_key_format, 0, pass, engine, - "server certificate private key file"); - if (s_key == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - s_cert = load_cert(s_cert_file, s_cert_format, - "server certificate file"); - - if (s_cert == NULL) { - ERR_print_errors(bio_err); - goto end; - } - if (s_chain_file != NULL) { - if (!load_certs(s_chain_file, &s_chain, FORMAT_PEM, NULL, - "server certificate chain")) - goto end; - } - - if (tlsextcbp.servername != NULL) { - s_key2 = load_key(s_key_file2, s_key_format, 0, pass, engine, - "second server certificate private key file"); - if (s_key2 == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - s_cert2 = load_cert(s_cert_file2, s_cert_format, - "second server certificate file"); - - if (s_cert2 == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - } -#if !defined(OPENSSL_NO_NEXTPROTONEG) - if (next_proto_neg_in) { - next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in); - if (next_proto.data == NULL) - goto end; - } -#endif - alpn_ctx.data = NULL; - if (alpn_in) { - alpn_ctx.data = next_protos_parse(&alpn_ctx.len, alpn_in); - if (alpn_ctx.data == NULL) - goto end; - } - - if (crl_file != NULL) { - X509_CRL *crl; - crl = load_crl(crl_file, crl_format); - if (crl == NULL) { - BIO_puts(bio_err, "Error loading CRL\n"); - ERR_print_errors(bio_err); - goto end; - } - crls = sk_X509_CRL_new_null(); - if (crls == NULL || !sk_X509_CRL_push(crls, crl)) { - BIO_puts(bio_err, "Error adding CRL\n"); - ERR_print_errors(bio_err); - X509_CRL_free(crl); - goto end; - } - } - - if (s_dcert_file != NULL) { - - if (s_dkey_file == NULL) - s_dkey_file = s_dcert_file; - - s_dkey = load_key(s_dkey_file, s_dkey_format, - 0, dpass, engine, "second certificate private key file"); - if (s_dkey == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - s_dcert = load_cert(s_dcert_file, s_dcert_format, - "second server certificate file"); - - if (s_dcert == NULL) { - ERR_print_errors(bio_err); - goto end; - } - if (s_dchain_file != NULL) { - if (!load_certs(s_dchain_file, &s_dchain, FORMAT_PEM, NULL, - "second server certificate chain")) - goto end; - } - - } - - if (bio_s_out == NULL) { - if (s_quiet && !s_debug) { - bio_s_out = BIO_new(BIO_s_null()); - if (s_msg && bio_s_msg == NULL) - bio_s_msg = dup_bio_out(FORMAT_TEXT); - } else { - if (bio_s_out == NULL) - bio_s_out = dup_bio_out(FORMAT_TEXT); - } - } -#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC) - if (nocert) -#endif - { - s_cert_file = NULL; - s_key_file = NULL; - s_dcert_file = NULL; - s_dkey_file = NULL; - s_cert_file2 = NULL; - s_key_file2 = NULL; - } - - ctx = SSL_CTX_new(meth); - if (ctx == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY); - - if (sdebug) - ssl_ctx_security_debug(ctx, sdebug); - - if (!config_ctx(cctx, ssl_args, ctx)) - goto end; - - if (ssl_config) { - if (SSL_CTX_config(ctx, ssl_config) == 0) { - BIO_printf(bio_err, "Error using configuration \"%s\"\n", - ssl_config); - ERR_print_errors(bio_err); - goto end; - } - } - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP && sctp_label_bug == 1) - SSL_CTX_set_mode(ctx, SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG); -#endif - - if (min_version != 0 - && SSL_CTX_set_min_proto_version(ctx, min_version) == 0) - goto end; - if (max_version != 0 - && SSL_CTX_set_max_proto_version(ctx, max_version) == 0) - goto end; - - if (session_id_prefix) { - if (strlen(session_id_prefix) >= 32) - BIO_printf(bio_err, - "warning: id_prefix is too long, only one new session will be possible\n"); - if (!SSL_CTX_set_generate_session_id(ctx, generate_session_id)) { - BIO_printf(bio_err, "error setting 'id_prefix'\n"); - ERR_print_errors(bio_err); - goto end; - } - BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix); - } - SSL_CTX_set_quiet_shutdown(ctx, 1); - if (exc != NULL) - ssl_ctx_set_excert(ctx, exc); - - if (state) - SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback); - if (no_cache) - SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); - else if (ext_cache) - init_session_cache_ctx(ctx); - else - SSL_CTX_sess_set_cache_size(ctx, 128); - - if (async) { - SSL_CTX_set_mode(ctx, SSL_MODE_ASYNC); - } - - if (max_send_fragment > 0 - && !SSL_CTX_set_max_send_fragment(ctx, max_send_fragment)) { - BIO_printf(bio_err, "%s: Max send fragment size %u is out of permitted range\n", - prog, max_send_fragment); - goto end; - } - - if (split_send_fragment > 0 - && !SSL_CTX_set_split_send_fragment(ctx, split_send_fragment)) { - BIO_printf(bio_err, "%s: Split send fragment size %u is out of permitted range\n", - prog, split_send_fragment); - goto end; - } - if (max_pipelines > 0 - && !SSL_CTX_set_max_pipelines(ctx, max_pipelines)) { - BIO_printf(bio_err, "%s: Max pipelines %u is out of permitted range\n", - prog, max_pipelines); - goto end; - } - - if (read_buf_len > 0) { - SSL_CTX_set_default_read_buffer_len(ctx, read_buf_len); - } -#ifndef OPENSSL_NO_SRTP - if (srtp_profiles != NULL) { - /* Returns 0 on success! */ - if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles) != 0) { - BIO_printf(bio_err, "Error setting SRTP profile\n"); - ERR_print_errors(bio_err); - goto end; - } - } -#endif - - if (!ctx_set_verify_locations(ctx, CAfile, CApath, noCAfile, noCApath)) { - ERR_print_errors(bio_err); - goto end; - } - if (vpmtouched && !SSL_CTX_set1_param(ctx, vpm)) { - BIO_printf(bio_err, "Error setting verify params\n"); - ERR_print_errors(bio_err); - goto end; - } - - ssl_ctx_add_crls(ctx, crls, 0); - - if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile, - crls, crl_download)) { - BIO_printf(bio_err, "Error loading store locations\n"); - ERR_print_errors(bio_err); - goto end; - } - - if (s_cert2) { - ctx2 = SSL_CTX_new(meth); - if (ctx2 == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (ctx2 != NULL) { - BIO_printf(bio_s_out, "Setting secondary ctx parameters\n"); - - if (sdebug) - ssl_ctx_security_debug(ctx2, sdebug); - - if (session_id_prefix) { - if (strlen(session_id_prefix) >= 32) - BIO_printf(bio_err, - "warning: id_prefix is too long, only one new session will be possible\n"); - if (!SSL_CTX_set_generate_session_id(ctx2, generate_session_id)) { - BIO_printf(bio_err, "error setting 'id_prefix'\n"); - ERR_print_errors(bio_err); - goto end; - } - BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix); - } - SSL_CTX_set_quiet_shutdown(ctx2, 1); - if (exc != NULL) - ssl_ctx_set_excert(ctx2, exc); - - if (state) - SSL_CTX_set_info_callback(ctx2, apps_ssl_info_callback); - - if (no_cache) - SSL_CTX_set_session_cache_mode(ctx2, SSL_SESS_CACHE_OFF); - else if (ext_cache) - init_session_cache_ctx(ctx2); - else - SSL_CTX_sess_set_cache_size(ctx2, 128); - - if (async) - SSL_CTX_set_mode(ctx2, SSL_MODE_ASYNC); - - if (!ctx_set_verify_locations(ctx2, CAfile, CApath, noCAfile, - noCApath)) { - ERR_print_errors(bio_err); - goto end; - } - if (vpmtouched && !SSL_CTX_set1_param(ctx2, vpm)) { - BIO_printf(bio_err, "Error setting verify params\n"); - ERR_print_errors(bio_err); - goto end; - } - - ssl_ctx_add_crls(ctx2, crls, 0); - if (!config_ctx(cctx, ssl_args, ctx2)) - goto end; - } -#ifndef OPENSSL_NO_NEXTPROTONEG - if (next_proto.data) - SSL_CTX_set_next_protos_advertised_cb(ctx, next_proto_cb, - &next_proto); -#endif - if (alpn_ctx.data) - SSL_CTX_set_alpn_select_cb(ctx, alpn_cb, &alpn_ctx); - -#ifndef OPENSSL_NO_DH - if (!no_dhe) { - DH *dh = NULL; - - if (dhfile != NULL) - dh = load_dh_param(dhfile); - else if (s_cert_file != NULL) - dh = load_dh_param(s_cert_file); - - if (dh != NULL) { - BIO_printf(bio_s_out, "Setting temp DH parameters\n"); - } else { - BIO_printf(bio_s_out, "Using default temp DH parameters\n"); - } - (void)BIO_flush(bio_s_out); - - if (dh == NULL) { - SSL_CTX_set_dh_auto(ctx, 1); - } else if (!SSL_CTX_set_tmp_dh(ctx, dh)) { - BIO_puts(bio_err, "Error setting temp DH parameters\n"); - ERR_print_errors(bio_err); - DH_free(dh); - goto end; - } - - if (ctx2 != NULL) { - if (!dhfile) { - DH *dh2 = load_dh_param(s_cert_file2); - if (dh2 != NULL) { - BIO_printf(bio_s_out, "Setting temp DH parameters\n"); - (void)BIO_flush(bio_s_out); - - DH_free(dh); - dh = dh2; - } - } - if (dh == NULL) { - SSL_CTX_set_dh_auto(ctx2, 1); - } else if (!SSL_CTX_set_tmp_dh(ctx2, dh)) { - BIO_puts(bio_err, "Error setting temp DH parameters\n"); - ERR_print_errors(bio_err); - DH_free(dh); - goto end; - } - } - DH_free(dh); - } -#endif - - if (!set_cert_key_stuff(ctx, s_cert, s_key, s_chain, build_chain)) - goto end; - - if (s_serverinfo_file != NULL - && !SSL_CTX_use_serverinfo_file(ctx, s_serverinfo_file)) { - ERR_print_errors(bio_err); - goto end; - } - - if (ctx2 != NULL - && !set_cert_key_stuff(ctx2, s_cert2, s_key2, NULL, build_chain)) - goto end; - - if (s_dcert != NULL) { - if (!set_cert_key_stuff(ctx, s_dcert, s_dkey, s_dchain, build_chain)) - goto end; - } - - if (no_resume_ephemeral) { - SSL_CTX_set_not_resumable_session_callback(ctx, - not_resumable_sess_cb); - - if (ctx2 != NULL) - SSL_CTX_set_not_resumable_session_callback(ctx2, - not_resumable_sess_cb); - } -#ifndef OPENSSL_NO_PSK - if (psk_key != NULL) { - if (s_debug) - BIO_printf(bio_s_out, "PSK key given, setting server callback\n"); - SSL_CTX_set_psk_server_callback(ctx, psk_server_cb); - } - - if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint)) { - BIO_printf(bio_err, "error setting PSK identity hint to context\n"); - ERR_print_errors(bio_err); - goto end; - } -#endif - if (psksessf != NULL) { - BIO *stmp = BIO_new_file(psksessf, "r"); - - if (stmp == NULL) { - BIO_printf(bio_err, "Can't open PSK session file %s\n", psksessf); - ERR_print_errors(bio_err); - goto end; - } - psksess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL); - BIO_free(stmp); - if (psksess == NULL) { - BIO_printf(bio_err, "Can't read PSK session file %s\n", psksessf); - ERR_print_errors(bio_err); - goto end; - } - - } - - if (psk_key != NULL || psksess != NULL) - SSL_CTX_set_psk_find_session_callback(ctx, psk_find_session_cb); - - SSL_CTX_set_verify(ctx, s_server_verify, verify_callback); - if (!SSL_CTX_set_session_id_context(ctx, - (void *)&s_server_session_id_context, - sizeof(s_server_session_id_context))) { - BIO_printf(bio_err, "error setting session id context\n"); - ERR_print_errors(bio_err); - goto end; - } - - /* Set DTLS cookie generation and verification callbacks */ - SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie_callback); - SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie_callback); - - /* Set TLS1.3 cookie generation and verification callbacks */ - SSL_CTX_set_stateless_cookie_generate_cb(ctx, generate_stateless_cookie_callback); - SSL_CTX_set_stateless_cookie_verify_cb(ctx, verify_stateless_cookie_callback); - - if (ctx2 != NULL) { - SSL_CTX_set_verify(ctx2, s_server_verify, verify_callback); - if (!SSL_CTX_set_session_id_context(ctx2, - (void *)&s_server_session_id_context, - sizeof(s_server_session_id_context))) { - BIO_printf(bio_err, "error setting session id context\n"); - ERR_print_errors(bio_err); - goto end; - } - tlsextcbp.biodebug = bio_s_out; - SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb); - SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp); - SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb); - SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp); - } - -#ifndef OPENSSL_NO_SRP - if (srp_verifier_file != NULL) { - srp_callback_parm.vb = SRP_VBASE_new(srpuserseed); - srp_callback_parm.user = NULL; - srp_callback_parm.login = NULL; - if ((ret = - SRP_VBASE_init(srp_callback_parm.vb, - srp_verifier_file)) != SRP_NO_ERROR) { - BIO_printf(bio_err, - "Cannot initialize SRP verifier file \"%s\":ret=%d\n", - srp_verifier_file, ret); - goto end; - } - SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, verify_callback); - SSL_CTX_set_srp_cb_arg(ctx, &srp_callback_parm); - SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb); - } else -#endif - if (CAfile != NULL) { - SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAfile)); - - if (ctx2) - SSL_CTX_set_client_CA_list(ctx2, SSL_load_client_CA_file(CAfile)); - } -#ifndef OPENSSL_NO_OCSP - if (s_tlsextstatus) { - SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb); - SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp); - if (ctx2) { - SSL_CTX_set_tlsext_status_cb(ctx2, cert_status_cb); - SSL_CTX_set_tlsext_status_arg(ctx2, &tlscstatp); - } - } -#endif - if (set_keylog_file(ctx, keylog_file)) - goto end; - - if (max_early_data >= 0) - SSL_CTX_set_max_early_data(ctx, max_early_data); - if (recv_max_early_data >= 0) - SSL_CTX_set_recv_max_early_data(ctx, recv_max_early_data); - - if (rev) - server_cb = rev_body; - else if (www) - server_cb = www_body; - else - server_cb = sv_body; -#ifdef AF_UNIX - if (socket_family == AF_UNIX - && unlink_unix_path) - unlink(host); -#endif - do_server(&accept_socket, host, port, socket_family, socket_type, protocol, - server_cb, context, naccept, bio_s_out); - print_stats(bio_s_out, ctx); - ret = 0; - end: - SSL_CTX_free(ctx); - SSL_SESSION_free(psksess); - set_keylog_file(NULL, NULL); - X509_free(s_cert); - sk_X509_CRL_pop_free(crls, X509_CRL_free); - X509_free(s_dcert); - EVP_PKEY_free(s_key); - EVP_PKEY_free(s_dkey); - sk_X509_pop_free(s_chain, X509_free); - sk_X509_pop_free(s_dchain, X509_free); - OPENSSL_free(pass); - OPENSSL_free(dpass); - OPENSSL_free(host); - OPENSSL_free(port); - X509_VERIFY_PARAM_free(vpm); - free_sessions(); - OPENSSL_free(tlscstatp.host); - OPENSSL_free(tlscstatp.port); - OPENSSL_free(tlscstatp.path); - SSL_CTX_free(ctx2); - X509_free(s_cert2); - EVP_PKEY_free(s_key2); -#ifndef OPENSSL_NO_NEXTPROTONEG - OPENSSL_free(next_proto.data); -#endif - OPENSSL_free(alpn_ctx.data); - ssl_excert_free(exc); - sk_OPENSSL_STRING_free(ssl_args); - SSL_CONF_CTX_free(cctx); - release_engine(engine); - BIO_free(bio_s_out); - bio_s_out = NULL; - BIO_free(bio_s_msg); - bio_s_msg = NULL; -#ifdef CHARSET_EBCDIC - BIO_meth_free(methods_ebcdic); -#endif - return ret; -} - -static void print_stats(BIO *bio, SSL_CTX *ssl_ctx) -{ - BIO_printf(bio, "%4ld items in the session cache\n", - SSL_CTX_sess_number(ssl_ctx)); - BIO_printf(bio, "%4ld client connects (SSL_connect())\n", - SSL_CTX_sess_connect(ssl_ctx)); - BIO_printf(bio, "%4ld client renegotiates (SSL_connect())\n", - SSL_CTX_sess_connect_renegotiate(ssl_ctx)); - BIO_printf(bio, "%4ld client connects that finished\n", - SSL_CTX_sess_connect_good(ssl_ctx)); - BIO_printf(bio, "%4ld server accepts (SSL_accept())\n", - SSL_CTX_sess_accept(ssl_ctx)); - BIO_printf(bio, "%4ld server renegotiates (SSL_accept())\n", - SSL_CTX_sess_accept_renegotiate(ssl_ctx)); - BIO_printf(bio, "%4ld server accepts that finished\n", - SSL_CTX_sess_accept_good(ssl_ctx)); - BIO_printf(bio, "%4ld session cache hits\n", SSL_CTX_sess_hits(ssl_ctx)); - BIO_printf(bio, "%4ld session cache misses\n", - SSL_CTX_sess_misses(ssl_ctx)); - BIO_printf(bio, "%4ld session cache timeouts\n", - SSL_CTX_sess_timeouts(ssl_ctx)); - BIO_printf(bio, "%4ld callback cache hits\n", - SSL_CTX_sess_cb_hits(ssl_ctx)); - BIO_printf(bio, "%4ld cache full overflows (%ld allowed)\n", - SSL_CTX_sess_cache_full(ssl_ctx), - SSL_CTX_sess_get_cache_size(ssl_ctx)); -} - -static int sv_body(int s, int stype, int prot, unsigned char *context) -{ - char *buf = NULL; - fd_set readfds; - int ret = 1, width; - int k, i; - unsigned long l; - SSL *con = NULL; - BIO *sbio; - struct timeval timeout; -#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)) - struct timeval *timeoutp; -#endif -#ifndef OPENSSL_NO_DTLS -# ifndef OPENSSL_NO_SCTP - int isdtls = (stype == SOCK_DGRAM || prot == IPPROTO_SCTP); -# else - int isdtls = (stype == SOCK_DGRAM); -# endif -#endif - - buf = app_malloc(bufsize, "server buffer"); - if (s_nbio) { - if (!BIO_socket_nbio(s, 1)) - ERR_print_errors(bio_err); - else if (!s_quiet) - BIO_printf(bio_err, "Turned on non blocking io\n"); - } - - con = SSL_new(ctx); - if (con == NULL) { - ret = -1; - goto err; - } - - if (s_tlsextdebug) { - SSL_set_tlsext_debug_callback(con, tlsext_cb); - SSL_set_tlsext_debug_arg(con, bio_s_out); - } - - if (context != NULL - && !SSL_set_session_id_context(con, context, - strlen((char *)context))) { - BIO_printf(bio_err, "Error setting session id context\n"); - ret = -1; - goto err; - } - - if (!SSL_clear(con)) { - BIO_printf(bio_err, "Error clearing SSL connection\n"); - ret = -1; - goto err; - } -#ifndef OPENSSL_NO_DTLS - if (isdtls) { -# ifndef OPENSSL_NO_SCTP - if (prot == IPPROTO_SCTP) - sbio = BIO_new_dgram_sctp(s, BIO_NOCLOSE); - else -# endif - sbio = BIO_new_dgram(s, BIO_NOCLOSE); - - if (enable_timeouts) { - timeout.tv_sec = 0; - timeout.tv_usec = DGRAM_RCV_TIMEOUT; - BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout); - - timeout.tv_sec = 0; - timeout.tv_usec = DGRAM_SND_TIMEOUT; - BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout); - } - - if (socket_mtu) { - if (socket_mtu < DTLS_get_link_min_mtu(con)) { - BIO_printf(bio_err, "MTU too small. Must be at least %ld\n", - DTLS_get_link_min_mtu(con)); - ret = -1; - BIO_free(sbio); - goto err; - } - SSL_set_options(con, SSL_OP_NO_QUERY_MTU); - if (!DTLS_set_link_mtu(con, socket_mtu)) { - BIO_printf(bio_err, "Failed to set MTU\n"); - ret = -1; - BIO_free(sbio); - goto err; - } - } else - /* want to do MTU discovery */ - BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL); - -# ifndef OPENSSL_NO_SCTP - if (prot != IPPROTO_SCTP) -# endif - /* Turn on cookie exchange. Not necessary for SCTP */ - SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE); - } else -#endif - sbio = BIO_new_socket(s, BIO_NOCLOSE); - - if (sbio == NULL) { - BIO_printf(bio_err, "Unable to create BIO\n"); - ERR_print_errors(bio_err); - goto err; - } - - if (s_nbio_test) { - BIO *test; - - test = BIO_new(BIO_f_nbio_test()); - sbio = BIO_push(test, sbio); - } - - SSL_set_bio(con, sbio, sbio); - SSL_set_accept_state(con); - /* SSL_set_fd(con,s); */ - - if (s_debug) { - BIO_set_callback(SSL_get_rbio(con), bio_dump_callback); - BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out); - } - if (s_msg) { -#ifndef OPENSSL_NO_SSL_TRACE - if (s_msg == 2) - SSL_set_msg_callback(con, SSL_trace); - else -#endif - SSL_set_msg_callback(con, msg_cb); - SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out); - } - - if (s_tlsextdebug) { - SSL_set_tlsext_debug_callback(con, tlsext_cb); - SSL_set_tlsext_debug_arg(con, bio_s_out); - } - - if (early_data) { - int write_header = 1, edret = SSL_READ_EARLY_DATA_ERROR; - size_t readbytes; - - while (edret != SSL_READ_EARLY_DATA_FINISH) { - for (;;) { - edret = SSL_read_early_data(con, buf, bufsize, &readbytes); - if (edret != SSL_READ_EARLY_DATA_ERROR) - break; - - switch (SSL_get_error(con, 0)) { - case SSL_ERROR_WANT_WRITE: - case SSL_ERROR_WANT_ASYNC: - case SSL_ERROR_WANT_READ: - /* Just keep trying - busy waiting */ - continue; - default: - BIO_printf(bio_err, "Error reading early data\n"); - ERR_print_errors(bio_err); - goto err; - } - } - if (readbytes > 0) { - if (write_header) { - BIO_printf(bio_s_out, "Early data received:\n"); - write_header = 0; - } - raw_write_stdout(buf, (unsigned int)readbytes); - (void)BIO_flush(bio_s_out); - } - } - if (write_header) { - if (SSL_get_early_data_status(con) == SSL_EARLY_DATA_NOT_SENT) - BIO_printf(bio_s_out, "No early data received\n"); - else - BIO_printf(bio_s_out, "Early data was rejected\n"); - } else { - BIO_printf(bio_s_out, "\nEnd of early data\n"); - } - if (SSL_is_init_finished(con)) - print_connection_info(con); - } - - if (fileno_stdin() > s) - width = fileno_stdin() + 1; - else - width = s + 1; - for (;;) { - int read_from_terminal; - int read_from_sslcon; - - read_from_terminal = 0; - read_from_sslcon = SSL_has_pending(con) - || (async && SSL_waiting_for_async(con)); - - if (!read_from_sslcon) { - FD_ZERO(&readfds); -#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) - openssl_fdset(fileno_stdin(), &readfds); -#endif - openssl_fdset(s, &readfds); - /* - * Note: under VMS with SOCKETSHR the second parameter is - * currently of type (int *) whereas under other systems it is - * (void *) if you don't have a cast it will choke the compiler: - * if you do have a cast then you can either go for (int *) or - * (void *). - */ -#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) - /* - * Under DOS (non-djgpp) and Windows we can't select on stdin: - * only on sockets. As a workaround we timeout the select every - * second and check for any keypress. In a proper Windows - * application we wouldn't do this because it is inefficient. - */ - timeout.tv_sec = 1; - timeout.tv_usec = 0; - i = select(width, (void *)&readfds, NULL, NULL, &timeout); - if (has_stdin_waiting()) - read_from_terminal = 1; - if ((i < 0) || (!i && !read_from_terminal)) - continue; -#else - if (SSL_is_dtls(con) && DTLSv1_get_timeout(con, &timeout)) - timeoutp = &timeout; - else - timeoutp = NULL; - - i = select(width, (void *)&readfds, NULL, NULL, timeoutp); - - if ((SSL_is_dtls(con)) && DTLSv1_handle_timeout(con) > 0) - BIO_printf(bio_err, "TIMEOUT occurred\n"); - - if (i <= 0) - continue; - if (FD_ISSET(fileno_stdin(), &readfds)) - read_from_terminal = 1; -#endif - if (FD_ISSET(s, &readfds)) - read_from_sslcon = 1; - } - if (read_from_terminal) { - if (s_crlf) { - int j, lf_num; - - i = raw_read_stdin(buf, bufsize / 2); - lf_num = 0; - /* both loops are skipped when i <= 0 */ - for (j = 0; j < i; j++) - if (buf[j] == '\n') - lf_num++; - for (j = i - 1; j >= 0; j--) { - buf[j + lf_num] = buf[j]; - if (buf[j] == '\n') { - lf_num--; - i++; - buf[j + lf_num] = '\r'; - } - } - assert(lf_num == 0); - } else { - i = raw_read_stdin(buf, bufsize); - } - - if (!s_quiet && !s_brief) { - if ((i <= 0) || (buf[0] == 'Q')) { - BIO_printf(bio_s_out, "DONE\n"); - (void)BIO_flush(bio_s_out); - BIO_closesocket(s); - close_accept_socket(); - ret = -11; - goto err; - } - if ((i <= 0) || (buf[0] == 'q')) { - BIO_printf(bio_s_out, "DONE\n"); - (void)BIO_flush(bio_s_out); - if (SSL_version(con) != DTLS1_VERSION) - BIO_closesocket(s); - /* - * close_accept_socket(); ret= -11; - */ - goto err; - } -#ifndef OPENSSL_NO_HEARTBEATS - if ((buf[0] == 'B') && ((buf[1] == '\n') || (buf[1] == '\r'))) { - BIO_printf(bio_err, "HEARTBEATING\n"); - SSL_heartbeat(con); - i = 0; - continue; - } -#endif - if ((buf[0] == 'r') && ((buf[1] == '\n') || (buf[1] == '\r'))) { - SSL_renegotiate(con); - i = SSL_do_handshake(con); - printf("SSL_do_handshake -> %d\n", i); - i = 0; /* 13; */ - continue; - } - if ((buf[0] == 'R') && ((buf[1] == '\n') || (buf[1] == '\r'))) { - SSL_set_verify(con, - SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, - NULL); - SSL_renegotiate(con); - i = SSL_do_handshake(con); - printf("SSL_do_handshake -> %d\n", i); - i = 0; /* 13; */ - continue; - } - if ((buf[0] == 'K' || buf[0] == 'k') - && ((buf[1] == '\n') || (buf[1] == '\r'))) { - SSL_key_update(con, buf[0] == 'K' ? - SSL_KEY_UPDATE_REQUESTED - : SSL_KEY_UPDATE_NOT_REQUESTED); - i = SSL_do_handshake(con); - printf("SSL_do_handshake -> %d\n", i); - i = 0; - continue; - } - if (buf[0] == 'c' && ((buf[1] == '\n') || (buf[1] == '\r'))) { - SSL_set_verify(con, SSL_VERIFY_PEER, NULL); - i = SSL_verify_client_post_handshake(con); - if (i == 0) { - printf("Failed to initiate request\n"); - ERR_print_errors(bio_err); - } else { - i = SSL_do_handshake(con); - printf("SSL_do_handshake -> %d\n", i); - i = 0; - } - continue; - } - if (buf[0] == 'P') { - static const char *str = "Lets print some clear text\n"; - BIO_write(SSL_get_wbio(con), str, strlen(str)); - } - if (buf[0] == 'S') { - print_stats(bio_s_out, SSL_get_SSL_CTX(con)); - } - } -#ifdef CHARSET_EBCDIC - ebcdic2ascii(buf, buf, i); -#endif - l = k = 0; - for (;;) { - /* should do a select for the write */ -#ifdef RENEG - static count = 0; - if (++count == 100) { - count = 0; - SSL_renegotiate(con); - } -#endif - k = SSL_write(con, &(buf[l]), (unsigned int)i); -#ifndef OPENSSL_NO_SRP - while (SSL_get_error(con, k) == SSL_ERROR_WANT_X509_LOOKUP) { - BIO_printf(bio_s_out, "LOOKUP renego during write\n"); - SRP_user_pwd_free(srp_callback_parm.user); - srp_callback_parm.user = - SRP_VBASE_get1_by_user(srp_callback_parm.vb, - srp_callback_parm.login); - if (srp_callback_parm.user) - BIO_printf(bio_s_out, "LOOKUP done %s\n", - srp_callback_parm.user->info); - else - BIO_printf(bio_s_out, "LOOKUP not successful\n"); - k = SSL_write(con, &(buf[l]), (unsigned int)i); - } -#endif - switch (SSL_get_error(con, k)) { - case SSL_ERROR_NONE: - break; - case SSL_ERROR_WANT_ASYNC: - BIO_printf(bio_s_out, "Write BLOCK (Async)\n"); - (void)BIO_flush(bio_s_out); - wait_for_async(con); - break; - case SSL_ERROR_WANT_WRITE: - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_X509_LOOKUP: - BIO_printf(bio_s_out, "Write BLOCK\n"); - (void)BIO_flush(bio_s_out); - break; - case SSL_ERROR_WANT_ASYNC_JOB: - /* - * This shouldn't ever happen in s_server. Treat as an error - */ - case SSL_ERROR_SYSCALL: - case SSL_ERROR_SSL: - BIO_printf(bio_s_out, "ERROR\n"); - (void)BIO_flush(bio_s_out); - ERR_print_errors(bio_err); - ret = 1; - goto err; - /* break; */ - case SSL_ERROR_ZERO_RETURN: - BIO_printf(bio_s_out, "DONE\n"); - (void)BIO_flush(bio_s_out); - ret = 1; - goto err; - } - if (k > 0) { - l += k; - i -= k; - } - if (i <= 0) - break; - } - } - if (read_from_sslcon) { - /* - * init_ssl_connection handles all async events itself so if we're - * waiting for async then we shouldn't go back into - * init_ssl_connection - */ - if ((!async || !SSL_waiting_for_async(con)) - && !SSL_is_init_finished(con)) { - i = init_ssl_connection(con); - - if (i < 0) { - ret = 0; - goto err; - } else if (i == 0) { - ret = 1; - goto err; - } - } else { - again: - i = SSL_read(con, (char *)buf, bufsize); -#ifndef OPENSSL_NO_SRP - while (SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) { - BIO_printf(bio_s_out, "LOOKUP renego during read\n"); - SRP_user_pwd_free(srp_callback_parm.user); - srp_callback_parm.user = - SRP_VBASE_get1_by_user(srp_callback_parm.vb, - srp_callback_parm.login); - if (srp_callback_parm.user) - BIO_printf(bio_s_out, "LOOKUP done %s\n", - srp_callback_parm.user->info); - else - BIO_printf(bio_s_out, "LOOKUP not successful\n"); - i = SSL_read(con, (char *)buf, bufsize); - } -#endif - switch (SSL_get_error(con, i)) { - case SSL_ERROR_NONE: -#ifdef CHARSET_EBCDIC - ascii2ebcdic(buf, buf, i); -#endif - raw_write_stdout(buf, (unsigned int)i); - (void)BIO_flush(bio_s_out); - if (SSL_has_pending(con)) - goto again; - break; - case SSL_ERROR_WANT_ASYNC: - BIO_printf(bio_s_out, "Read BLOCK (Async)\n"); - (void)BIO_flush(bio_s_out); - wait_for_async(con); - break; - case SSL_ERROR_WANT_WRITE: - case SSL_ERROR_WANT_READ: - BIO_printf(bio_s_out, "Read BLOCK\n"); - (void)BIO_flush(bio_s_out); - break; - case SSL_ERROR_WANT_ASYNC_JOB: - /* - * This shouldn't ever happen in s_server. Treat as an error - */ - case SSL_ERROR_SYSCALL: - case SSL_ERROR_SSL: - BIO_printf(bio_s_out, "ERROR\n"); - (void)BIO_flush(bio_s_out); - ERR_print_errors(bio_err); - ret = 1; - goto err; - case SSL_ERROR_ZERO_RETURN: - BIO_printf(bio_s_out, "DONE\n"); - (void)BIO_flush(bio_s_out); - ret = 1; - goto err; - } - } - } - } - err: - if (con != NULL) { - BIO_printf(bio_s_out, "shutting down SSL\n"); - SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); - SSL_free(con); - } - BIO_printf(bio_s_out, "CONNECTION CLOSED\n"); - OPENSSL_clear_free(buf, bufsize); - return ret; -} - -static void close_accept_socket(void) -{ - BIO_printf(bio_err, "shutdown accept socket\n"); - if (accept_socket >= 0) { - BIO_closesocket(accept_socket); - } -} - -static int is_retryable(SSL *con, int i) -{ - int err = SSL_get_error(con, i); - - /* If it's not a fatal error, it must be retryable */ - return (err != SSL_ERROR_SSL) - && (err != SSL_ERROR_SYSCALL) - && (err != SSL_ERROR_ZERO_RETURN); -} - -static int init_ssl_connection(SSL *con) -{ - int i; - long verify_err; - int retry = 0; - - if (dtlslisten || stateless) { - BIO_ADDR *client = NULL; - - if (dtlslisten) { - if ((client = BIO_ADDR_new()) == NULL) { - BIO_printf(bio_err, "ERROR - memory\n"); - return 0; - } - i = DTLSv1_listen(con, client); - } else { - i = SSL_stateless(con); - } - if (i > 0) { - BIO *wbio; - int fd = -1; - - if (dtlslisten) { - wbio = SSL_get_wbio(con); - if (wbio) { - BIO_get_fd(wbio, &fd); - } - - if (!wbio || BIO_connect(fd, client, 0) == 0) { - BIO_printf(bio_err, "ERROR - unable to connect\n"); - BIO_ADDR_free(client); - return 0; - } - - (void)BIO_ctrl_set_connected(wbio, client); - BIO_ADDR_free(client); - dtlslisten = 0; - } else { - stateless = 0; - } - i = SSL_accept(con); - } else { - BIO_ADDR_free(client); - } - } else { - do { - i = SSL_accept(con); - - if (i <= 0) - retry = is_retryable(con, i); -#ifdef CERT_CB_TEST_RETRY - { - while (i <= 0 - && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP - && SSL_get_state(con) == TLS_ST_SR_CLNT_HELLO) { - BIO_printf(bio_err, - "LOOKUP from certificate callback during accept\n"); - i = SSL_accept(con); - if (i <= 0) - retry = is_retryable(con, i); - } - } -#endif - -#ifndef OPENSSL_NO_SRP - while (i <= 0 - && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) { - BIO_printf(bio_s_out, "LOOKUP during accept %s\n", - srp_callback_parm.login); - SRP_user_pwd_free(srp_callback_parm.user); - srp_callback_parm.user = - SRP_VBASE_get1_by_user(srp_callback_parm.vb, - srp_callback_parm.login); - if (srp_callback_parm.user) - BIO_printf(bio_s_out, "LOOKUP done %s\n", - srp_callback_parm.user->info); - else - BIO_printf(bio_s_out, "LOOKUP not successful\n"); - i = SSL_accept(con); - if (i <= 0) - retry = is_retryable(con, i); - } -#endif - } while (i < 0 && SSL_waiting_for_async(con)); - } - - if (i <= 0) { - if (((dtlslisten || stateless) && i == 0) - || (!dtlslisten && !stateless && retry)) { - BIO_printf(bio_s_out, "DELAY\n"); - return 1; - } - - BIO_printf(bio_err, "ERROR\n"); - - verify_err = SSL_get_verify_result(con); - if (verify_err != X509_V_OK) { - BIO_printf(bio_err, "verify error:%s\n", - X509_verify_cert_error_string(verify_err)); - } - /* Always print any error messages */ - ERR_print_errors(bio_err); - return 0; - } - - print_connection_info(con); - return 1; -} - -static void print_connection_info(SSL *con) -{ - const char *str; - X509 *peer; - char buf[BUFSIZ]; -#if !defined(OPENSSL_NO_NEXTPROTONEG) - const unsigned char *next_proto_neg; - unsigned next_proto_neg_len; -#endif - unsigned char *exportedkeymat; - int i; - - if (s_brief) - print_ssl_summary(con); - - PEM_write_bio_SSL_SESSION(bio_s_out, SSL_get_session(con)); - - peer = SSL_get_peer_certificate(con); - if (peer != NULL) { - BIO_printf(bio_s_out, "Client certificate\n"); - PEM_write_bio_X509(bio_s_out, peer); - dump_cert_text(bio_s_out, peer); - X509_free(peer); - peer = NULL; - } - - if (SSL_get_shared_ciphers(con, buf, sizeof(buf)) != NULL) - BIO_printf(bio_s_out, "Shared ciphers:%s\n", buf); - str = SSL_CIPHER_get_name(SSL_get_current_cipher(con)); - ssl_print_sigalgs(bio_s_out, con); -#ifndef OPENSSL_NO_EC - ssl_print_point_formats(bio_s_out, con); - ssl_print_groups(bio_s_out, con, 0); -#endif - print_ca_names(bio_s_out, con); - BIO_printf(bio_s_out, "CIPHER is %s\n", (str != NULL) ? str : "(NONE)"); - -#if !defined(OPENSSL_NO_NEXTPROTONEG) - SSL_get0_next_proto_negotiated(con, &next_proto_neg, &next_proto_neg_len); - if (next_proto_neg) { - BIO_printf(bio_s_out, "NEXTPROTO is "); - BIO_write(bio_s_out, next_proto_neg, next_proto_neg_len); - BIO_printf(bio_s_out, "\n"); - } -#endif -#ifndef OPENSSL_NO_SRTP - { - SRTP_PROTECTION_PROFILE *srtp_profile - = SSL_get_selected_srtp_profile(con); - - if (srtp_profile) - BIO_printf(bio_s_out, "SRTP Extension negotiated, profile=%s\n", - srtp_profile->name); - } -#endif - if (SSL_session_reused(con)) - BIO_printf(bio_s_out, "Reused session-id\n"); - BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n", - SSL_get_secure_renegotiation_support(con) ? "" : " NOT"); - if ((SSL_get_options(con) & SSL_OP_NO_RENEGOTIATION)) - BIO_printf(bio_s_out, "Renegotiation is DISABLED\n"); - - if (keymatexportlabel != NULL) { - BIO_printf(bio_s_out, "Keying material exporter:\n"); - BIO_printf(bio_s_out, " Label: '%s'\n", keymatexportlabel); - BIO_printf(bio_s_out, " Length: %i bytes\n", keymatexportlen); - exportedkeymat = app_malloc(keymatexportlen, "export key"); - if (!SSL_export_keying_material(con, exportedkeymat, - keymatexportlen, - keymatexportlabel, - strlen(keymatexportlabel), - NULL, 0, 0)) { - BIO_printf(bio_s_out, " Error\n"); - } else { - BIO_printf(bio_s_out, " Keying material: "); - for (i = 0; i < keymatexportlen; i++) - BIO_printf(bio_s_out, "%02X", exportedkeymat[i]); - BIO_printf(bio_s_out, "\n"); - } - OPENSSL_free(exportedkeymat); - } - - (void)BIO_flush(bio_s_out); -} - -#ifndef OPENSSL_NO_DH -static DH *load_dh_param(const char *dhfile) -{ - DH *ret = NULL; - BIO *bio; - - if ((bio = BIO_new_file(dhfile, "r")) == NULL) - goto err; - ret = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); - err: - BIO_free(bio); - return ret; -} -#endif - -static int www_body(int s, int stype, int prot, unsigned char *context) -{ - char *buf = NULL; - int ret = 1; - int i, j, k, dot; - SSL *con; - const SSL_CIPHER *c; - BIO *io, *ssl_bio, *sbio; -#ifdef RENEG - int total_bytes = 0; -#endif - int width; - fd_set readfds; - - /* Set width for a select call if needed */ - width = s + 1; - - buf = app_malloc(bufsize, "server www buffer"); - io = BIO_new(BIO_f_buffer()); - ssl_bio = BIO_new(BIO_f_ssl()); - if ((io == NULL) || (ssl_bio == NULL)) - goto err; - - if (s_nbio) { - if (!BIO_socket_nbio(s, 1)) - ERR_print_errors(bio_err); - else if (!s_quiet) - BIO_printf(bio_err, "Turned on non blocking io\n"); - } - - /* lets make the output buffer a reasonable size */ - if (!BIO_set_write_buffer_size(io, bufsize)) - goto err; - - if ((con = SSL_new(ctx)) == NULL) - goto err; - - if (s_tlsextdebug) { - SSL_set_tlsext_debug_callback(con, tlsext_cb); - SSL_set_tlsext_debug_arg(con, bio_s_out); - } - - if (context != NULL - && !SSL_set_session_id_context(con, context, - strlen((char *)context))) { - SSL_free(con); - goto err; - } - - sbio = BIO_new_socket(s, BIO_NOCLOSE); - if (s_nbio_test) { - BIO *test; - - test = BIO_new(BIO_f_nbio_test()); - sbio = BIO_push(test, sbio); - } - SSL_set_bio(con, sbio, sbio); - SSL_set_accept_state(con); - - /* No need to free |con| after this. Done by BIO_free(ssl_bio) */ - BIO_set_ssl(ssl_bio, con, BIO_CLOSE); - BIO_push(io, ssl_bio); -#ifdef CHARSET_EBCDIC - io = BIO_push(BIO_new(BIO_f_ebcdic_filter()), io); -#endif - - if (s_debug) { - BIO_set_callback(SSL_get_rbio(con), bio_dump_callback); - BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out); - } - if (s_msg) { -#ifndef OPENSSL_NO_SSL_TRACE - if (s_msg == 2) - SSL_set_msg_callback(con, SSL_trace); - else -#endif - SSL_set_msg_callback(con, msg_cb); - SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out); - } - - for (;;) { - i = BIO_gets(io, buf, bufsize - 1); - if (i < 0) { /* error */ - if (!BIO_should_retry(io) && !SSL_waiting_for_async(con)) { - if (!s_quiet) - ERR_print_errors(bio_err); - goto err; - } else { - BIO_printf(bio_s_out, "read R BLOCK\n"); -#ifndef OPENSSL_NO_SRP - if (BIO_should_io_special(io) - && BIO_get_retry_reason(io) == BIO_RR_SSL_X509_LOOKUP) { - BIO_printf(bio_s_out, "LOOKUP renego during read\n"); - SRP_user_pwd_free(srp_callback_parm.user); - srp_callback_parm.user = - SRP_VBASE_get1_by_user(srp_callback_parm.vb, - srp_callback_parm.login); - if (srp_callback_parm.user) - BIO_printf(bio_s_out, "LOOKUP done %s\n", - srp_callback_parm.user->info); - else - BIO_printf(bio_s_out, "LOOKUP not successful\n"); - continue; - } -#endif -#if !defined(OPENSSL_SYS_MSDOS) - sleep(1); -#endif - continue; - } - } else if (i == 0) { /* end of input */ - ret = 1; - goto end; - } - - /* else we have data */ - if (((www == 1) && (strncmp("GET ", buf, 4) == 0)) || - ((www == 2) && (strncmp("GET /stats ", buf, 11) == 0))) { - char *p; - X509 *peer = NULL; - STACK_OF(SSL_CIPHER) *sk; - static const char *space = " "; - - if (www == 1 && strncmp("GET /reneg", buf, 10) == 0) { - if (strncmp("GET /renegcert", buf, 14) == 0) - SSL_set_verify(con, - SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, - NULL); - i = SSL_renegotiate(con); - BIO_printf(bio_s_out, "SSL_renegotiate -> %d\n", i); - /* Send the HelloRequest */ - i = SSL_do_handshake(con); - if (i <= 0) { - BIO_printf(bio_s_out, "SSL_do_handshake() Retval %d\n", - SSL_get_error(con, i)); - ERR_print_errors(bio_err); - goto err; - } - /* Wait for a ClientHello to come back */ - FD_ZERO(&readfds); - openssl_fdset(s, &readfds); - i = select(width, (void *)&readfds, NULL, NULL, NULL); - if (i <= 0 || !FD_ISSET(s, &readfds)) { - BIO_printf(bio_s_out, - "Error waiting for client response\n"); - ERR_print_errors(bio_err); - goto err; - } - /* - * We're not actually expecting any data here and we ignore - * any that is sent. This is just to force the handshake that - * we're expecting to come from the client. If they haven't - * sent one there's not much we can do. - */ - BIO_gets(io, buf, bufsize - 1); - } - - BIO_puts(io, - "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n"); - BIO_puts(io, "<HTML><BODY BGCOLOR=\"#ffffff\">\n"); - BIO_puts(io, "<pre>\n"); - /* BIO_puts(io, OpenSSL_version(OPENSSL_VERSION)); */ - BIO_puts(io, "\n"); - for (i = 0; i < local_argc; i++) { - const char *myp; - for (myp = local_argv[i]; *myp; myp++) - switch (*myp) { - case '<': - BIO_puts(io, "<"); - break; - case '>': - BIO_puts(io, ">"); - break; - case '&': - BIO_puts(io, "&"); - break; - default: - BIO_write(io, myp, 1); - break; - } - BIO_write(io, " ", 1); - } - BIO_puts(io, "\n"); - - BIO_printf(io, - "Secure Renegotiation IS%s supported\n", - SSL_get_secure_renegotiation_support(con) ? - "" : " NOT"); - - /* - * The following is evil and should not really be done - */ - BIO_printf(io, "Ciphers supported in s_server binary\n"); - sk = SSL_get_ciphers(con); - j = sk_SSL_CIPHER_num(sk); - for (i = 0; i < j; i++) { - c = sk_SSL_CIPHER_value(sk, i); - BIO_printf(io, "%-11s:%-25s ", - SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c)); - if ((((i + 1) % 2) == 0) && (i + 1 != j)) - BIO_puts(io, "\n"); - } - BIO_puts(io, "\n"); - p = SSL_get_shared_ciphers(con, buf, bufsize); - if (p != NULL) { - BIO_printf(io, - "---\nCiphers common between both SSL end points:\n"); - j = i = 0; - while (*p) { - if (*p == ':') { - BIO_write(io, space, 26 - j); - i++; - j = 0; - BIO_write(io, ((i % 3) ? " " : "\n"), 1); - } else { - BIO_write(io, p, 1); - j++; - } - p++; - } - BIO_puts(io, "\n"); - } - ssl_print_sigalgs(io, con); -#ifndef OPENSSL_NO_EC - ssl_print_groups(io, con, 0); -#endif - print_ca_names(io, con); - BIO_printf(io, (SSL_session_reused(con) - ? "---\nReused, " : "---\nNew, ")); - c = SSL_get_current_cipher(con); - BIO_printf(io, "%s, Cipher is %s\n", - SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c)); - SSL_SESSION_print(io, SSL_get_session(con)); - BIO_printf(io, "---\n"); - print_stats(io, SSL_get_SSL_CTX(con)); - BIO_printf(io, "---\n"); - peer = SSL_get_peer_certificate(con); - if (peer != NULL) { - BIO_printf(io, "Client certificate\n"); - X509_print(io, peer); - PEM_write_bio_X509(io, peer); - X509_free(peer); - peer = NULL; - } else { - BIO_puts(io, "no client certificate available\n"); - } - BIO_puts(io, "</pre></BODY></HTML>\r\n\r\n"); - break; - } else if ((www == 2 || www == 3) - && (strncmp("GET /", buf, 5) == 0)) { - BIO *file; - char *p, *e; - static const char *text = - "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n"; - - /* skip the '/' */ - p = &(buf[5]); - - dot = 1; - for (e = p; *e != '\0'; e++) { - if (e[0] == ' ') - break; - - if (e[0] == ':') { - /* Windows drive. We treat this the same way as ".." */ - dot = -1; - break; - } - - switch (dot) { - case 1: - dot = (e[0] == '.') ? 2 : 0; - break; - case 2: - dot = (e[0] == '.') ? 3 : 0; - break; - case 3: - dot = (e[0] == '/' || e[0] == '\\') ? -1 : 0; - break; - } - if (dot == 0) - dot = (e[0] == '/' || e[0] == '\\') ? 1 : 0; - } - dot = (dot == 3) || (dot == -1); /* filename contains ".." - * component */ - - if (*e == '\0') { - BIO_puts(io, text); - BIO_printf(io, "'%s' is an invalid file name\r\n", p); - break; - } - *e = '\0'; - - if (dot) { - BIO_puts(io, text); - BIO_printf(io, "'%s' contains '..' or ':'\r\n", p); - break; - } - - if (*p == '/' || *p == '\\') { - BIO_puts(io, text); - BIO_printf(io, "'%s' is an invalid path\r\n", p); - break; - } - - /* if a directory, do the index thang */ - if (app_isdir(p) > 0) { - BIO_puts(io, text); - BIO_printf(io, "'%s' is a directory\r\n", p); - break; - } - - if ((file = BIO_new_file(p, "r")) == NULL) { - BIO_puts(io, text); - BIO_printf(io, "Error opening '%s'\r\n", p); - ERR_print_errors(io); - break; - } - - if (!s_quiet) - BIO_printf(bio_err, "FILE:%s\n", p); - - if (www == 2) { - i = strlen(p); - if (((i > 5) && (strcmp(&(p[i - 5]), ".html") == 0)) || - ((i > 4) && (strcmp(&(p[i - 4]), ".php") == 0)) || - ((i > 4) && (strcmp(&(p[i - 4]), ".htm") == 0))) - BIO_puts(io, - "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n"); - else - BIO_puts(io, - "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n"); - } - /* send the file */ - for (;;) { - i = BIO_read(file, buf, bufsize); - if (i <= 0) - break; - -#ifdef RENEG - total_bytes += i; - BIO_printf(bio_err, "%d\n", i); - if (total_bytes > 3 * 1024) { - total_bytes = 0; - BIO_printf(bio_err, "RENEGOTIATE\n"); - SSL_renegotiate(con); - } -#endif - - for (j = 0; j < i;) { -#ifdef RENEG - static count = 0; - if (++count == 13) { - SSL_renegotiate(con); - } -#endif - k = BIO_write(io, &(buf[j]), i - j); - if (k <= 0) { - if (!BIO_should_retry(io) - && !SSL_waiting_for_async(con)) - goto write_error; - else { - BIO_printf(bio_s_out, "rwrite W BLOCK\n"); - } - } else { - j += k; - } - } - } - write_error: - BIO_free(file); - break; - } - } - - for (;;) { - i = (int)BIO_flush(io); - if (i <= 0) { - if (!BIO_should_retry(io)) - break; - } else - break; - } - end: - /* make sure we re-use sessions */ - SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); - - err: - OPENSSL_free(buf); - BIO_free_all(io); - return ret; -} - -static int rev_body(int s, int stype, int prot, unsigned char *context) -{ - char *buf = NULL; - int i; - int ret = 1; - SSL *con; - BIO *io, *ssl_bio, *sbio; - - buf = app_malloc(bufsize, "server rev buffer"); - io = BIO_new(BIO_f_buffer()); - ssl_bio = BIO_new(BIO_f_ssl()); - if ((io == NULL) || (ssl_bio == NULL)) - goto err; - - /* lets make the output buffer a reasonable size */ - if (!BIO_set_write_buffer_size(io, bufsize)) - goto err; - - if ((con = SSL_new(ctx)) == NULL) - goto err; - - if (s_tlsextdebug) { - SSL_set_tlsext_debug_callback(con, tlsext_cb); - SSL_set_tlsext_debug_arg(con, bio_s_out); - } - if (context != NULL - && !SSL_set_session_id_context(con, context, - strlen((char *)context))) { - SSL_free(con); - ERR_print_errors(bio_err); - goto err; - } - - sbio = BIO_new_socket(s, BIO_NOCLOSE); - SSL_set_bio(con, sbio, sbio); - SSL_set_accept_state(con); - - /* No need to free |con| after this. Done by BIO_free(ssl_bio) */ - BIO_set_ssl(ssl_bio, con, BIO_CLOSE); - BIO_push(io, ssl_bio); -#ifdef CHARSET_EBCDIC - io = BIO_push(BIO_new(BIO_f_ebcdic_filter()), io); -#endif - - if (s_debug) { - BIO_set_callback(SSL_get_rbio(con), bio_dump_callback); - BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out); - } - if (s_msg) { -#ifndef OPENSSL_NO_SSL_TRACE - if (s_msg == 2) - SSL_set_msg_callback(con, SSL_trace); - else -#endif - SSL_set_msg_callback(con, msg_cb); - SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out); - } - - for (;;) { - i = BIO_do_handshake(io); - if (i > 0) - break; - if (!BIO_should_retry(io)) { - BIO_puts(bio_err, "CONNECTION FAILURE\n"); - ERR_print_errors(bio_err); - goto end; - } -#ifndef OPENSSL_NO_SRP - if (BIO_should_io_special(io) - && BIO_get_retry_reason(io) == BIO_RR_SSL_X509_LOOKUP) { - BIO_printf(bio_s_out, "LOOKUP renego during accept\n"); - SRP_user_pwd_free(srp_callback_parm.user); - srp_callback_parm.user = - SRP_VBASE_get1_by_user(srp_callback_parm.vb, - srp_callback_parm.login); - if (srp_callback_parm.user) - BIO_printf(bio_s_out, "LOOKUP done %s\n", - srp_callback_parm.user->info); - else - BIO_printf(bio_s_out, "LOOKUP not successful\n"); - continue; - } -#endif - } - BIO_printf(bio_err, "CONNECTION ESTABLISHED\n"); - print_ssl_summary(con); - - for (;;) { - i = BIO_gets(io, buf, bufsize - 1); - if (i < 0) { /* error */ - if (!BIO_should_retry(io)) { - if (!s_quiet) - ERR_print_errors(bio_err); - goto err; - } else { - BIO_printf(bio_s_out, "read R BLOCK\n"); -#ifndef OPENSSL_NO_SRP - if (BIO_should_io_special(io) - && BIO_get_retry_reason(io) == BIO_RR_SSL_X509_LOOKUP) { - BIO_printf(bio_s_out, "LOOKUP renego during read\n"); - SRP_user_pwd_free(srp_callback_parm.user); - srp_callback_parm.user = - SRP_VBASE_get1_by_user(srp_callback_parm.vb, - srp_callback_parm.login); - if (srp_callback_parm.user) - BIO_printf(bio_s_out, "LOOKUP done %s\n", - srp_callback_parm.user->info); - else - BIO_printf(bio_s_out, "LOOKUP not successful\n"); - continue; - } -#endif -#if !defined(OPENSSL_SYS_MSDOS) - sleep(1); -#endif - continue; - } - } else if (i == 0) { /* end of input */ - ret = 1; - BIO_printf(bio_err, "CONNECTION CLOSED\n"); - goto end; - } else { - char *p = buf + i - 1; - while (i && (*p == '\n' || *p == '\r')) { - p--; - i--; - } - if (!s_ign_eof && (i == 5) && (strncmp(buf, "CLOSE", 5) == 0)) { - ret = 1; - BIO_printf(bio_err, "CONNECTION CLOSED\n"); - goto end; - } - BUF_reverse((unsigned char *)buf, NULL, i); - buf[i] = '\n'; - BIO_write(io, buf, i + 1); - for (;;) { - i = BIO_flush(io); - if (i > 0) - break; - if (!BIO_should_retry(io)) - goto end; - } - } - } - end: - /* make sure we re-use sessions */ - SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); - - err: - - OPENSSL_free(buf); - BIO_free_all(io); - return ret; -} - -#define MAX_SESSION_ID_ATTEMPTS 10 -static int generate_session_id(SSL *ssl, unsigned char *id, - unsigned int *id_len) -{ - unsigned int count = 0; - do { - if (RAND_bytes(id, *id_len) <= 0) - return 0; - /* - * Prefix the session_id with the required prefix. NB: If our prefix - * is too long, clip it - but there will be worse effects anyway, eg. - * the server could only possibly create 1 session ID (ie. the - * prefix!) so all future session negotiations will fail due to - * conflicts. - */ - memcpy(id, session_id_prefix, - (strlen(session_id_prefix) < *id_len) ? - strlen(session_id_prefix) : *id_len); - } - while (SSL_has_matching_session_id(ssl, id, *id_len) && - (++count < MAX_SESSION_ID_ATTEMPTS)); - if (count >= MAX_SESSION_ID_ATTEMPTS) - return 0; - return 1; -} - -/* - * By default s_server uses an in-memory cache which caches SSL_SESSION - * structures without any serialisation. This hides some bugs which only - * become apparent in deployed servers. By implementing a basic external - * session cache some issues can be debugged using s_server. - */ - -typedef struct simple_ssl_session_st { - unsigned char *id; - unsigned int idlen; - unsigned char *der; - int derlen; - struct simple_ssl_session_st *next; -} simple_ssl_session; - -static simple_ssl_session *first = NULL; - -static int add_session(SSL *ssl, SSL_SESSION *session) -{ - simple_ssl_session *sess = app_malloc(sizeof(*sess), "get session"); - unsigned char *p; - - SSL_SESSION_get_id(session, &sess->idlen); - sess->derlen = i2d_SSL_SESSION(session, NULL); - if (sess->derlen < 0) { - BIO_printf(bio_err, "Error encoding session\n"); - OPENSSL_free(sess); - return 0; - } - - sess->id = OPENSSL_memdup(SSL_SESSION_get_id(session, NULL), sess->idlen); - sess->der = app_malloc(sess->derlen, "get session buffer"); - if (!sess->id) { - BIO_printf(bio_err, "Out of memory adding to external cache\n"); - OPENSSL_free(sess->id); - OPENSSL_free(sess->der); - OPENSSL_free(sess); - return 0; - } - p = sess->der; - - /* Assume it still works. */ - if (i2d_SSL_SESSION(session, &p) != sess->derlen) { - BIO_printf(bio_err, "Unexpected session encoding length\n"); - OPENSSL_free(sess->id); - OPENSSL_free(sess->der); - OPENSSL_free(sess); - return 0; - } - - sess->next = first; - first = sess; - BIO_printf(bio_err, "New session added to external cache\n"); - return 0; -} - -static SSL_SESSION *get_session(SSL *ssl, const unsigned char *id, int idlen, - int *do_copy) -{ - simple_ssl_session *sess; - *do_copy = 0; - for (sess = first; sess; sess = sess->next) { - if (idlen == (int)sess->idlen && !memcmp(sess->id, id, idlen)) { - const unsigned char *p = sess->der; - BIO_printf(bio_err, "Lookup session: cache hit\n"); - return d2i_SSL_SESSION(NULL, &p, sess->derlen); - } - } - BIO_printf(bio_err, "Lookup session: cache miss\n"); - return NULL; -} - -static void del_session(SSL_CTX *sctx, SSL_SESSION *session) -{ - simple_ssl_session *sess, *prev = NULL; - const unsigned char *id; - unsigned int idlen; - id = SSL_SESSION_get_id(session, &idlen); - for (sess = first; sess; sess = sess->next) { - if (idlen == sess->idlen && !memcmp(sess->id, id, idlen)) { - if (prev) - prev->next = sess->next; - else - first = sess->next; - OPENSSL_free(sess->id); - OPENSSL_free(sess->der); - OPENSSL_free(sess); - return; - } - prev = sess; - } -} - -static void init_session_cache_ctx(SSL_CTX *sctx) -{ - SSL_CTX_set_session_cache_mode(sctx, - SSL_SESS_CACHE_NO_INTERNAL | - SSL_SESS_CACHE_SERVER); - SSL_CTX_sess_set_new_cb(sctx, add_session); - SSL_CTX_sess_set_get_cb(sctx, get_session); - SSL_CTX_sess_set_remove_cb(sctx, del_session); -} - -static void free_sessions(void) -{ - simple_ssl_session *sess, *tsess; - for (sess = first; sess;) { - OPENSSL_free(sess->id); - OPENSSL_free(sess->der); - tsess = sess; - sess = sess->next; - OPENSSL_free(tsess); - } - first = NULL; -} - -#endif /* OPENSSL_NO_SOCK */ diff --git a/contrib/libs/openssl/apps/s_socket.c b/contrib/libs/openssl/apps/s_socket.c deleted file mode 100644 index aee366d5f4..0000000000 --- a/contrib/libs/openssl/apps/s_socket.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* socket-related functions used by s_client and s_server */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <signal.h> -#include <openssl/opensslconf.h> - -/* - * With IPv6, it looks like Digital has mixed up the proper order of - * recursive header file inclusion, resulting in the compiler complaining - * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is - * needed to have fileno() declared correctly... So let's define u_int - */ -#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) -# define __U_INT -typedef unsigned int u_int; -#endif - -#ifndef OPENSSL_NO_SOCK - -# include "apps.h" -# include "s_apps.h" -# include "internal/sockets.h" - -# include <openssl/bio.h> -# include <openssl/err.h> - -/* Keep track of our peer's address for the cookie callback */ -BIO_ADDR *ourpeer = NULL; - -/* - * init_client - helper routine to set up socket communication - * @sock: pointer to storage of resulting socket. - * @host: the host name or path (for AF_UNIX) to connect to. - * @port: the port to connect to (ignored for AF_UNIX). - * @bindhost: source host or path (for AF_UNIX). - * @bindport: source port (ignored for AF_UNIX). - * @family: desired socket family, may be AF_INET, AF_INET6, AF_UNIX or - * AF_UNSPEC - * @type: socket type, must be SOCK_STREAM or SOCK_DGRAM - * @protocol: socket protocol, e.g. IPPROTO_TCP or IPPROTO_UDP (or 0 for any) - * - * This will create a socket and use it to connect to a host:port, or if - * family == AF_UNIX, to the path found in host. - * - * If the host has more than one address, it will try them one by one until - * a successful connection is established. The resulting socket will be - * found in *sock on success, it will be given INVALID_SOCKET otherwise. - * - * Returns 1 on success, 0 on failure. - */ -int init_client(int *sock, const char *host, const char *port, - const char *bindhost, const char *bindport, - int family, int type, int protocol) -{ - BIO_ADDRINFO *res = NULL; - BIO_ADDRINFO *bindaddr = NULL; - const BIO_ADDRINFO *ai = NULL; - const BIO_ADDRINFO *bi = NULL; - int found = 0; - int ret; - - if (BIO_sock_init() != 1) - return 0; - - ret = BIO_lookup_ex(host, port, BIO_LOOKUP_CLIENT, family, type, protocol, - &res); - if (ret == 0) { - ERR_print_errors(bio_err); - return 0; - } - - if (bindhost != NULL || bindport != NULL) { - ret = BIO_lookup_ex(bindhost, bindport, BIO_LOOKUP_CLIENT, - family, type, protocol, &bindaddr); - if (ret == 0) { - ERR_print_errors (bio_err); - goto out; - } - } - - ret = 0; - for (ai = res; ai != NULL; ai = BIO_ADDRINFO_next(ai)) { - /* Admittedly, these checks are quite paranoid, we should not get - * anything in the BIO_ADDRINFO chain that we haven't - * asked for. */ - OPENSSL_assert((family == AF_UNSPEC - || family == BIO_ADDRINFO_family(ai)) - && (type == 0 || type == BIO_ADDRINFO_socktype(ai)) - && (protocol == 0 - || protocol == BIO_ADDRINFO_protocol(ai))); - - if (bindaddr != NULL) { - for (bi = bindaddr; bi != NULL; bi = BIO_ADDRINFO_next(bi)) { - if (BIO_ADDRINFO_family(bi) == BIO_ADDRINFO_family(ai)) - break; - } - if (bi == NULL) - continue; - ++found; - } - - *sock = BIO_socket(BIO_ADDRINFO_family(ai), BIO_ADDRINFO_socktype(ai), - BIO_ADDRINFO_protocol(ai), 0); - if (*sock == INVALID_SOCKET) { - /* Maybe the kernel doesn't support the socket family, even if - * BIO_lookup() added it in the returned result... - */ - continue; - } - - if (bi != NULL) { - if (!BIO_bind(*sock, BIO_ADDRINFO_address(bi), - BIO_SOCK_REUSEADDR)) { - BIO_closesocket(*sock); - *sock = INVALID_SOCKET; - break; - } - } - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP) { - /* - * For SCTP we have to set various options on the socket prior to - * connecting. This is done automatically by BIO_new_dgram_sctp(). - * We don't actually need the created BIO though so we free it again - * immediately. - */ - BIO *tmpbio = BIO_new_dgram_sctp(*sock, BIO_NOCLOSE); - - if (tmpbio == NULL) { - ERR_print_errors(bio_err); - return 0; - } - BIO_free(tmpbio); - } -#endif - - if (!BIO_connect(*sock, BIO_ADDRINFO_address(ai), - protocol == IPPROTO_TCP ? BIO_SOCK_NODELAY : 0)) { - BIO_closesocket(*sock); - *sock = INVALID_SOCKET; - continue; - } - - /* Success, don't try any more addresses */ - break; - } - - if (*sock == INVALID_SOCKET) { - if (bindaddr != NULL && !found) { - BIO_printf(bio_err, "Can't bind %saddress for %s%s%s\n", - BIO_ADDRINFO_family(res) == AF_INET6 ? "IPv6 " : - BIO_ADDRINFO_family(res) == AF_INET ? "IPv4 " : - BIO_ADDRINFO_family(res) == AF_UNIX ? "unix " : "", - bindhost != NULL ? bindhost : "", - bindport != NULL ? ":" : "", - bindport != NULL ? bindport : ""); - ERR_clear_error(); - ret = 0; - } - ERR_print_errors(bio_err); - } else { - /* Remove any stale errors from previous connection attempts */ - ERR_clear_error(); - ret = 1; - } -out: - if (bindaddr != NULL) { - BIO_ADDRINFO_free (bindaddr); - } - BIO_ADDRINFO_free(res); - return ret; -} - -/* - * do_server - helper routine to perform a server operation - * @accept_sock: pointer to storage of resulting socket. - * @host: the host name or path (for AF_UNIX) to connect to. - * @port: the port to connect to (ignored for AF_UNIX). - * @family: desired socket family, may be AF_INET, AF_INET6, AF_UNIX or - * AF_UNSPEC - * @type: socket type, must be SOCK_STREAM or SOCK_DGRAM - * @cb: pointer to a function that receives the accepted socket and - * should perform the communication with the connecting client. - * @context: pointer to memory that's passed verbatim to the cb function. - * @naccept: number of times an incoming connect should be accepted. If -1, - * unlimited number. - * - * This will create a socket and use it to listen to a host:port, or if - * family == AF_UNIX, to the path found in host, then start accepting - * incoming connections and run cb on the resulting socket. - * - * 0 on failure, something other on success. - */ -int do_server(int *accept_sock, const char *host, const char *port, - int family, int type, int protocol, do_server_cb cb, - unsigned char *context, int naccept, BIO *bio_s_out) -{ - int asock = 0; - int sock; - int i; - BIO_ADDRINFO *res = NULL; - const BIO_ADDRINFO *next; - int sock_family, sock_type, sock_protocol, sock_port; - const BIO_ADDR *sock_address; - int sock_family_fallback = AF_UNSPEC; - const BIO_ADDR *sock_address_fallback = NULL; - int sock_options = BIO_SOCK_REUSEADDR; - int ret = 0; - - if (BIO_sock_init() != 1) - return 0; - - if (!BIO_lookup_ex(host, port, BIO_LOOKUP_SERVER, family, type, protocol, - &res)) { - ERR_print_errors(bio_err); - return 0; - } - - /* Admittedly, these checks are quite paranoid, we should not get - * anything in the BIO_ADDRINFO chain that we haven't asked for */ - OPENSSL_assert((family == AF_UNSPEC || family == BIO_ADDRINFO_family(res)) - && (type == 0 || type == BIO_ADDRINFO_socktype(res)) - && (protocol == 0 || protocol == BIO_ADDRINFO_protocol(res))); - - sock_family = BIO_ADDRINFO_family(res); - sock_type = BIO_ADDRINFO_socktype(res); - sock_protocol = BIO_ADDRINFO_protocol(res); - sock_address = BIO_ADDRINFO_address(res); - next = BIO_ADDRINFO_next(res); - if (sock_family == AF_INET6) - sock_options |= BIO_SOCK_V6_ONLY; - if (next != NULL - && BIO_ADDRINFO_socktype(next) == sock_type - && BIO_ADDRINFO_protocol(next) == sock_protocol) { - if (sock_family == AF_INET - && BIO_ADDRINFO_family(next) == AF_INET6) { - /* In case AF_INET6 is returned but not supported by the - * kernel, retry with the first detected address family */ - sock_family_fallback = sock_family; - sock_address_fallback = sock_address; - sock_family = AF_INET6; - sock_address = BIO_ADDRINFO_address(next); - } else if (sock_family == AF_INET6 - && BIO_ADDRINFO_family(next) == AF_INET) { - sock_options &= ~BIO_SOCK_V6_ONLY; - } - } - - asock = BIO_socket(sock_family, sock_type, sock_protocol, 0); - if (asock == INVALID_SOCKET && sock_family_fallback != AF_UNSPEC) { - asock = BIO_socket(sock_family_fallback, sock_type, sock_protocol, 0); - sock_address = sock_address_fallback; - } - if (asock == INVALID_SOCKET - || !BIO_listen(asock, sock_address, sock_options)) { - BIO_ADDRINFO_free(res); - ERR_print_errors(bio_err); - if (asock != INVALID_SOCKET) - BIO_closesocket(asock); - goto end; - } - -#ifndef OPENSSL_NO_SCTP - if (protocol == IPPROTO_SCTP) { - /* - * For SCTP we have to set various options on the socket prior to - * accepting. This is done automatically by BIO_new_dgram_sctp(). - * We don't actually need the created BIO though so we free it again - * immediately. - */ - BIO *tmpbio = BIO_new_dgram_sctp(asock, BIO_NOCLOSE); - - if (tmpbio == NULL) { - BIO_closesocket(asock); - ERR_print_errors(bio_err); - goto end; - } - BIO_free(tmpbio); - } -#endif - - sock_port = BIO_ADDR_rawport(sock_address); - - BIO_ADDRINFO_free(res); - res = NULL; - - if (sock_port == 0) { - /* dynamically allocated port, report which one */ - union BIO_sock_info_u info; - char *hostname = NULL; - char *service = NULL; - int success = 0; - - if ((info.addr = BIO_ADDR_new()) != NULL - && BIO_sock_info(asock, BIO_SOCK_INFO_ADDRESS, &info) - && (hostname = BIO_ADDR_hostname_string(info.addr, 1)) != NULL - && (service = BIO_ADDR_service_string(info.addr, 1)) != NULL - && BIO_printf(bio_s_out, - strchr(hostname, ':') == NULL - ? /* IPv4 */ "ACCEPT %s:%s\n" - : /* IPv6 */ "ACCEPT [%s]:%s\n", - hostname, service) > 0) - success = 1; - - (void)BIO_flush(bio_s_out); - OPENSSL_free(hostname); - OPENSSL_free(service); - BIO_ADDR_free(info.addr); - if (!success) { - BIO_closesocket(asock); - ERR_print_errors(bio_err); - goto end; - } - } else { - (void)BIO_printf(bio_s_out, "ACCEPT\n"); - (void)BIO_flush(bio_s_out); - } - - if (accept_sock != NULL) - *accept_sock = asock; - for (;;) { - char sink[64]; - struct timeval timeout; - fd_set readfds; - - if (type == SOCK_STREAM) { - BIO_ADDR_free(ourpeer); - ourpeer = BIO_ADDR_new(); - if (ourpeer == NULL) { - BIO_closesocket(asock); - ERR_print_errors(bio_err); - goto end; - } - do { - sock = BIO_accept_ex(asock, ourpeer, 0); - } while (sock < 0 && BIO_sock_should_retry(sock)); - if (sock < 0) { - ERR_print_errors(bio_err); - BIO_closesocket(asock); - break; - } - BIO_set_tcp_ndelay(sock, 1); - i = (*cb)(sock, type, protocol, context); - - /* - * If we ended with an alert being sent, but still with data in the - * network buffer to be read, then calling BIO_closesocket() will - * result in a TCP-RST being sent. On some platforms (notably - * Windows) then this will result in the peer immediately abandoning - * the connection including any buffered alert data before it has - * had a chance to be read. Shutting down the sending side first, - * and then closing the socket sends TCP-FIN first followed by - * TCP-RST. This seems to allow the peer to read the alert data. - */ - shutdown(sock, 1); /* SHUT_WR */ - /* - * We just said we have nothing else to say, but it doesn't mean - * that the other side has nothing. It's even recommended to - * consume incoming data. [In testing context this ensures that - * alerts are passed on...] - */ - timeout.tv_sec = 0; - timeout.tv_usec = 500000; /* some extreme round-trip */ - do { - FD_ZERO(&readfds); - openssl_fdset(sock, &readfds); - } while (select(sock + 1, &readfds, NULL, NULL, &timeout) > 0 - && readsocket(sock, sink, sizeof(sink)) > 0); - - BIO_closesocket(sock); - } else { - i = (*cb)(asock, type, protocol, context); - } - - if (naccept != -1) - naccept--; - if (i < 0 || naccept == 0) { - BIO_closesocket(asock); - ret = i; - break; - } - } - end: -# ifdef AF_UNIX - if (family == AF_UNIX) - unlink(host); -# endif - BIO_ADDR_free(ourpeer); - ourpeer = NULL; - return ret; -} - -#endif /* OPENSSL_NO_SOCK */ diff --git a/contrib/libs/openssl/apps/s_time.c b/contrib/libs/openssl/apps/s_time.c deleted file mode 100644 index 1235e545c2..0000000000 --- a/contrib/libs/openssl/apps/s_time.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <openssl/opensslconf.h> - -#ifndef OPENSSL_NO_SOCK - -#include "apps.h" -#include "progs.h" -#include <openssl/x509.h> -#include <openssl/ssl.h> -#include <openssl/pem.h> -#include "s_apps.h" -#include <openssl/err.h> -#include <internal/sockets.h> -#if !defined(OPENSSL_SYS_MSDOS) -# include OPENSSL_UNISTD -#endif - -#define SSL_CONNECT_NAME "localhost:4433" - -#define SECONDS 30 -#define SECONDSSTR "30" - -static SSL *doConnection(SSL *scon, const char *host, SSL_CTX *ctx); - -/* - * Define a HTTP get command globally. - * Also define the size of the command, this is two bytes less than - * the size of the string because the %s is replaced by the URL. - */ -static const char fmt_http_get_cmd[] = "GET %s HTTP/1.0\r\n\r\n"; -static const size_t fmt_http_get_cmd_size = sizeof(fmt_http_get_cmd) - 2; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_CONNECT, OPT_CIPHER, OPT_CIPHERSUITES, OPT_CERT, OPT_NAMEOPT, OPT_KEY, - OPT_CAPATH, OPT_CAFILE, OPT_NOCAPATH, OPT_NOCAFILE, OPT_NEW, OPT_REUSE, - OPT_BUGS, OPT_VERIFY, OPT_TIME, OPT_SSL3, - OPT_WWW -} OPTION_CHOICE; - -const OPTIONS s_time_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"connect", OPT_CONNECT, 's', - "Where to connect as post:port (default is " SSL_CONNECT_NAME ")"}, - {"cipher", OPT_CIPHER, 's', "TLSv1.2 and below cipher list to be used"}, - {"ciphersuites", OPT_CIPHERSUITES, 's', - "Specify TLSv1.3 ciphersuites to be used"}, - {"cert", OPT_CERT, '<', "Cert file to use, PEM format assumed"}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - {"key", OPT_KEY, '<', "File with key, PEM; default is -cert file"}, - {"CApath", OPT_CAPATH, '/', "PEM format directory of CA's"}, - {"cafile", OPT_CAFILE, '<', "PEM format file of CA's"}, - {"CAfile", OPT_CAFILE, '<', "PEM format file of CA's"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"new", OPT_NEW, '-', "Just time new connections"}, - {"reuse", OPT_REUSE, '-', "Just time connection reuse"}, - {"bugs", OPT_BUGS, '-', "Turn on SSL bug compatibility"}, - {"verify", OPT_VERIFY, 'p', - "Turn on peer certificate verification, set depth"}, - {"time", OPT_TIME, 'p', "Seconds to collect data, default " SECONDSSTR}, - {"www", OPT_WWW, 's', "Fetch specified page from the site"}, -#ifndef OPENSSL_NO_SSL3 - {"ssl3", OPT_SSL3, '-', "Just use SSLv3"}, -#endif - {NULL} -}; - -#define START 0 -#define STOP 1 - -static double tm_Time_F(int s) -{ - return app_tminterval(s, 1); -} - -int s_time_main(int argc, char **argv) -{ - char buf[1024 * 8]; - SSL *scon = NULL; - SSL_CTX *ctx = NULL; - const SSL_METHOD *meth = NULL; - char *CApath = NULL, *CAfile = NULL, *cipher = NULL, *ciphersuites = NULL; - char *www_path = NULL; - char *host = SSL_CONNECT_NAME, *certfile = NULL, *keyfile = NULL, *prog; - double totalTime = 0.0; - int noCApath = 0, noCAfile = 0; - int maxtime = SECONDS, nConn = 0, perform = 3, ret = 1, i, st_bugs = 0; - long bytes_read = 0, finishtime = 0; - OPTION_CHOICE o; - int max_version = 0, ver, buf_len; - size_t buf_size; - - meth = TLS_client_method(); - - prog = opt_init(argc, argv, s_time_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(s_time_options); - ret = 0; - goto end; - case OPT_CONNECT: - host = opt_arg(); - break; - case OPT_REUSE: - perform = 2; - break; - case OPT_NEW: - perform = 1; - break; - case OPT_VERIFY: - if (!opt_int(opt_arg(), &verify_args.depth)) - goto opthelp; - BIO_printf(bio_err, "%s: verify depth is %d\n", - prog, verify_args.depth); - break; - case OPT_CERT: - certfile = opt_arg(); - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto end; - break; - case OPT_KEY: - keyfile = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_CIPHER: - cipher = opt_arg(); - break; - case OPT_CIPHERSUITES: - ciphersuites = opt_arg(); - break; - case OPT_BUGS: - st_bugs = 1; - break; - case OPT_TIME: - if (!opt_int(opt_arg(), &maxtime)) - goto opthelp; - break; - case OPT_WWW: - www_path = opt_arg(); - buf_size = strlen(www_path) + fmt_http_get_cmd_size; - if (buf_size > sizeof(buf)) { - BIO_printf(bio_err, "%s: -www option is too long\n", prog); - goto end; - } - break; - case OPT_SSL3: - max_version = SSL3_VERSION; - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (cipher == NULL) - cipher = getenv("SSL_CIPHER"); - - if ((ctx = SSL_CTX_new(meth)) == NULL) - goto end; - - SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); - SSL_CTX_set_quiet_shutdown(ctx, 1); - if (SSL_CTX_set_max_proto_version(ctx, max_version) == 0) - goto end; - - if (st_bugs) - SSL_CTX_set_options(ctx, SSL_OP_ALL); - if (cipher != NULL && !SSL_CTX_set_cipher_list(ctx, cipher)) - goto end; - if (ciphersuites != NULL && !SSL_CTX_set_ciphersuites(ctx, ciphersuites)) - goto end; - if (!set_cert_stuff(ctx, certfile, keyfile)) - goto end; - - if (!ctx_set_verify_locations(ctx, CAfile, CApath, noCAfile, noCApath)) { - ERR_print_errors(bio_err); - goto end; - } - if (!(perform & 1)) - goto next; - printf("Collecting connection statistics for %d seconds\n", maxtime); - - /* Loop and time how long it takes to make connections */ - - bytes_read = 0; - finishtime = (long)time(NULL) + maxtime; - tm_Time_F(START); - for (;;) { - if (finishtime < (long)time(NULL)) - break; - - if ((scon = doConnection(NULL, host, ctx)) == NULL) - goto end; - - if (www_path != NULL) { - buf_len = BIO_snprintf(buf, sizeof(buf), fmt_http_get_cmd, - www_path); - if (buf_len <= 0 || SSL_write(scon, buf, buf_len) <= 0) - goto end; - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) - bytes_read += i; - } - SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); - BIO_closesocket(SSL_get_fd(scon)); - - nConn += 1; - if (SSL_session_reused(scon)) { - ver = 'r'; - } else { - ver = SSL_version(scon); - if (ver == TLS1_VERSION) - ver = 't'; - else if (ver == SSL3_VERSION) - ver = '3'; - else - ver = '*'; - } - fputc(ver, stdout); - fflush(stdout); - - SSL_free(scon); - scon = NULL; - } - totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ - - i = (int)((long)time(NULL) - finishtime + maxtime); - printf - ("\n\n%d connections in %.2fs; %.2f connections/user sec, bytes read %ld\n", - nConn, totalTime, ((double)nConn / totalTime), bytes_read); - printf - ("%d connections in %ld real seconds, %ld bytes read per connection\n", - nConn, (long)time(NULL) - finishtime + maxtime, - nConn > 0 ? bytes_read / nConn : 0l); - - /* - * Now loop and time connections using the same session id over and over - */ - - next: - if (!(perform & 2)) - goto end; - printf("\n\nNow timing with session id reuse.\n"); - - /* Get an SSL object so we can reuse the session id */ - if ((scon = doConnection(NULL, host, ctx)) == NULL) { - BIO_printf(bio_err, "Unable to get connection\n"); - goto end; - } - - if (www_path != NULL) { - buf_len = BIO_snprintf(buf, sizeof(buf), fmt_http_get_cmd, www_path); - if (buf_len <= 0 || SSL_write(scon, buf, buf_len) <= 0) - goto end; - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) - continue; - } - SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); - BIO_closesocket(SSL_get_fd(scon)); - - nConn = 0; - totalTime = 0.0; - - finishtime = (long)time(NULL) + maxtime; - - printf("starting\n"); - bytes_read = 0; - tm_Time_F(START); - - for (;;) { - if (finishtime < (long)time(NULL)) - break; - - if ((doConnection(scon, host, ctx)) == NULL) - goto end; - - if (www_path != NULL) { - buf_len = BIO_snprintf(buf, sizeof(buf), fmt_http_get_cmd, - www_path); - if (buf_len <= 0 || SSL_write(scon, buf, buf_len) <= 0) - goto end; - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) - bytes_read += i; - } - SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); - BIO_closesocket(SSL_get_fd(scon)); - - nConn += 1; - if (SSL_session_reused(scon)) { - ver = 'r'; - } else { - ver = SSL_version(scon); - if (ver == TLS1_VERSION) - ver = 't'; - else if (ver == SSL3_VERSION) - ver = '3'; - else - ver = '*'; - } - fputc(ver, stdout); - fflush(stdout); - } - totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ - - printf - ("\n\n%d connections in %.2fs; %.2f connections/user sec, bytes read %ld\n", - nConn, totalTime, ((double)nConn / totalTime), bytes_read); - printf - ("%d connections in %ld real seconds, %ld bytes read per connection\n", - nConn, (long)time(NULL) - finishtime + maxtime, bytes_read / nConn); - - ret = 0; - - end: - SSL_free(scon); - SSL_CTX_free(ctx); - return ret; -} - -/*- - * doConnection - make a connection - */ -static SSL *doConnection(SSL *scon, const char *host, SSL_CTX *ctx) -{ - BIO *conn; - SSL *serverCon; - int i; - - if ((conn = BIO_new(BIO_s_connect())) == NULL) - return NULL; - - BIO_set_conn_hostname(conn, host); - BIO_set_conn_mode(conn, BIO_SOCK_NODELAY); - - if (scon == NULL) - serverCon = SSL_new(ctx); - else { - serverCon = scon; - SSL_set_connect_state(serverCon); - } - - SSL_set_bio(serverCon, conn, conn); - - /* ok, lets connect */ - i = SSL_connect(serverCon); - if (i <= 0) { - BIO_printf(bio_err, "ERROR\n"); - if (verify_args.error != X509_V_OK) - BIO_printf(bio_err, "verify error:%s\n", - X509_verify_cert_error_string(verify_args.error)); - else - ERR_print_errors(bio_err); - if (scon == NULL) - SSL_free(serverCon); - return NULL; - } - -#if defined(SOL_SOCKET) && defined(SO_LINGER) - { - struct linger no_linger; - int fd; - - no_linger.l_onoff = 1; - no_linger.l_linger = 0; - fd = SSL_get_fd(serverCon); - if (fd >= 0) - (void)setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&no_linger, - sizeof(no_linger)); - } -#endif - - return serverCon; -} -#endif /* OPENSSL_NO_SOCK */ diff --git a/contrib/libs/openssl/apps/sess_id.c b/contrib/libs/openssl/apps/sess_id.c deleted file mode 100644 index 8fd584f3b1..0000000000 --- a/contrib/libs/openssl/apps/sess_id.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/x509.h> -#include <openssl/pem.h> -#include <openssl/ssl.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, - OPT_TEXT, OPT_CERT, OPT_NOOUT, OPT_CONTEXT -} OPTION_CHOICE; - -const OPTIONS sess_id_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'F', "Input format - default PEM (DER or PEM)"}, - {"outform", OPT_OUTFORM, 'f', - "Output format - default PEM (PEM, DER or NSS)"}, - {"in", OPT_IN, 's', "Input file - default stdin"}, - {"out", OPT_OUT, '>', "Output file - default stdout"}, - {"text", OPT_TEXT, '-', "Print ssl session id details"}, - {"cert", OPT_CERT, '-', "Output certificate "}, - {"noout", OPT_NOOUT, '-', "Don't output the encoded session info"}, - {"context", OPT_CONTEXT, 's', "Set the session ID context"}, - {NULL} -}; - -static SSL_SESSION *load_sess_id(char *file, int format); - -int sess_id_main(int argc, char **argv) -{ - SSL_SESSION *x = NULL; - X509 *peer = NULL; - BIO *out = NULL; - char *infile = NULL, *outfile = NULL, *context = NULL, *prog; - int informat = FORMAT_PEM, outformat = FORMAT_PEM; - int cert = 0, noout = 0, text = 0, ret = 1, i, num = 0; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, sess_id_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(sess_id_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat)) - goto opthelp; - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER | OPT_FMT_NSS, - &outformat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_TEXT: - text = ++num; - break; - case OPT_CERT: - cert = ++num; - break; - case OPT_NOOUT: - noout = ++num; - break; - case OPT_CONTEXT: - context = opt_arg(); - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - x = load_sess_id(infile, informat); - if (x == NULL) { - goto end; - } - peer = SSL_SESSION_get0_peer(x); - - if (context != NULL) { - size_t ctx_len = strlen(context); - if (ctx_len > SSL_MAX_SID_CTX_LENGTH) { - BIO_printf(bio_err, "Context too long\n"); - goto end; - } - if (!SSL_SESSION_set1_id_context(x, (unsigned char *)context, - ctx_len)) { - BIO_printf(bio_err, "Error setting id context\n"); - goto end; - } - } - - if (!noout || text) { - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - } - - if (text) { - SSL_SESSION_print(out, x); - - if (cert) { - if (peer == NULL) - BIO_puts(out, "No certificate present\n"); - else - X509_print(out, peer); - } - } - - if (!noout && !cert) { - if (outformat == FORMAT_ASN1) { - i = i2d_SSL_SESSION_bio(out, x); - } else if (outformat == FORMAT_PEM) { - i = PEM_write_bio_SSL_SESSION(out, x); - } else if (outformat == FORMAT_NSS) { - i = SSL_SESSION_print_keylog(out, x); - } else { - BIO_printf(bio_err, "bad output format specified for outfile\n"); - goto end; - } - if (!i) { - BIO_printf(bio_err, "unable to write SSL_SESSION\n"); - goto end; - } - } else if (!noout && (peer != NULL)) { /* just print the certificate */ - if (outformat == FORMAT_ASN1) { - i = (int)i2d_X509_bio(out, peer); - } else if (outformat == FORMAT_PEM) { - i = PEM_write_bio_X509(out, peer); - } else { - BIO_printf(bio_err, "bad output format specified for outfile\n"); - goto end; - } - if (!i) { - BIO_printf(bio_err, "unable to write X509\n"); - goto end; - } - } - ret = 0; - end: - BIO_free_all(out); - SSL_SESSION_free(x); - return ret; -} - -static SSL_SESSION *load_sess_id(char *infile, int format) -{ - SSL_SESSION *x = NULL; - BIO *in = NULL; - - in = bio_open_default(infile, 'r', format); - if (in == NULL) - goto end; - if (format == FORMAT_ASN1) - x = d2i_SSL_SESSION_bio(in, NULL); - else - x = PEM_read_bio_SSL_SESSION(in, NULL, NULL, NULL); - if (x == NULL) { - BIO_printf(bio_err, "unable to load SSL_SESSION\n"); - ERR_print_errors(bio_err); - goto end; - } - - end: - BIO_free(in); - return x; -} diff --git a/contrib/libs/openssl/apps/smime.c b/contrib/libs/openssl/apps/smime.c deleted file mode 100644 index 6fd473775f..0000000000 --- a/contrib/libs/openssl/apps/smime.c +++ /dev/null @@ -1,647 +0,0 @@ -/* - * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* S/MIME utility function */ - -#include <stdio.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/crypto.h> -#include <openssl/pem.h> -#include <openssl/err.h> -#include <openssl/x509_vfy.h> -#include <openssl/x509v3.h> - -static int save_certs(char *signerfile, STACK_OF(X509) *signers); -static int smime_cb(int ok, X509_STORE_CTX *ctx); - -#define SMIME_OP 0x10 -#define SMIME_IP 0x20 -#define SMIME_SIGNERS 0x40 -#define SMIME_ENCRYPT (1 | SMIME_OP) -#define SMIME_DECRYPT (2 | SMIME_IP) -#define SMIME_SIGN (3 | SMIME_OP | SMIME_SIGNERS) -#define SMIME_VERIFY (4 | SMIME_IP) -#define SMIME_PK7OUT (5 | SMIME_IP | SMIME_OP) -#define SMIME_RESIGN (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS) - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENCRYPT, OPT_DECRYPT, OPT_SIGN, OPT_RESIGN, OPT_VERIFY, - OPT_PK7OUT, OPT_TEXT, OPT_NOINTERN, OPT_NOVERIFY, OPT_NOCHAIN, - OPT_NOCERTS, OPT_NOATTR, OPT_NODETACH, OPT_NOSMIMECAP, - OPT_BINARY, OPT_NOSIGS, OPT_STREAM, OPT_INDEF, OPT_NOINDEF, - OPT_CRLFEOL, OPT_ENGINE, OPT_PASSIN, - OPT_TO, OPT_FROM, OPT_SUBJECT, OPT_SIGNER, OPT_RECIP, OPT_MD, - OPT_CIPHER, OPT_INKEY, OPT_KEYFORM, OPT_CERTFILE, OPT_CAFILE, - OPT_R_ENUM, - OPT_V_ENUM, - OPT_CAPATH, OPT_NOCAFILE, OPT_NOCAPATH, OPT_IN, OPT_INFORM, OPT_OUT, - OPT_OUTFORM, OPT_CONTENT -} OPTION_CHOICE; - -const OPTIONS smime_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] cert.pem...\n"}, - {OPT_HELP_STR, 1, '-', - " cert.pem... recipient certs for encryption\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"encrypt", OPT_ENCRYPT, '-', "Encrypt message"}, - {"decrypt", OPT_DECRYPT, '-', "Decrypt encrypted message"}, - {"sign", OPT_SIGN, '-', "Sign message"}, - {"verify", OPT_VERIFY, '-', "Verify signed message"}, - {"pk7out", OPT_PK7OUT, '-', "Output PKCS#7 structure"}, - {"nointern", OPT_NOINTERN, '-', - "Don't search certificates in message for signer"}, - {"nosigs", OPT_NOSIGS, '-', "Don't verify message signature"}, - {"noverify", OPT_NOVERIFY, '-', "Don't verify signers certificate"}, - {"nocerts", OPT_NOCERTS, '-', - "Don't include signers certificate when signing"}, - {"nodetach", OPT_NODETACH, '-', "Use opaque signing"}, - {"noattr", OPT_NOATTR, '-', "Don't include any signed attributes"}, - {"binary", OPT_BINARY, '-', "Don't translate message to text"}, - {"certfile", OPT_CERTFILE, '<', "Other certificates file"}, - {"signer", OPT_SIGNER, 's', "Signer certificate file"}, - {"recip", OPT_RECIP, '<', "Recipient certificate file for decryption"}, - {"in", OPT_IN, '<', "Input file"}, - {"inform", OPT_INFORM, 'c', "Input format SMIME (default), PEM or DER"}, - {"inkey", OPT_INKEY, 's', - "Input private key (if not signer or recipient)"}, - {"keyform", OPT_KEYFORM, 'f', "Input private key format (PEM or ENGINE)"}, - {"out", OPT_OUT, '>', "Output file"}, - {"outform", OPT_OUTFORM, 'c', - "Output format SMIME (default), PEM or DER"}, - {"content", OPT_CONTENT, '<', - "Supply or override content for detached signature"}, - {"to", OPT_TO, 's', "To address"}, - {"from", OPT_FROM, 's', "From address"}, - {"subject", OPT_SUBJECT, 's', "Subject"}, - {"text", OPT_TEXT, '-', "Include or delete text MIME headers"}, - {"CApath", OPT_CAPATH, '/', "Trusted certificates directory"}, - {"CAfile", OPT_CAFILE, '<', "Trusted certificates file"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"resign", OPT_RESIGN, '-', "Resign a signed message"}, - {"nochain", OPT_NOCHAIN, '-', - "set PKCS7_NOCHAIN so certificates contained in the message are not used as untrusted CAs" }, - {"nosmimecap", OPT_NOSMIMECAP, '-', "Omit the SMIMECapabilities attribute"}, - {"stream", OPT_STREAM, '-', "Enable CMS streaming" }, - {"indef", OPT_INDEF, '-', "Same as -stream" }, - {"noindef", OPT_NOINDEF, '-', "Disable CMS streaming"}, - {"crlfeol", OPT_CRLFEOL, '-', "Use CRLF as EOL termination instead of CR only"}, - OPT_R_OPTIONS, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"md", OPT_MD, 's', "Digest algorithm to use when signing or resigning"}, - {"", OPT_CIPHER, '-', "Any supported cipher"}, - OPT_V_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int smime_main(int argc, char **argv) -{ - BIO *in = NULL, *out = NULL, *indata = NULL; - EVP_PKEY *key = NULL; - PKCS7 *p7 = NULL; - STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL; - STACK_OF(X509) *encerts = NULL, *other = NULL; - X509 *cert = NULL, *recip = NULL, *signer = NULL; - X509_STORE *store = NULL; - X509_VERIFY_PARAM *vpm = NULL; - const EVP_CIPHER *cipher = NULL; - const EVP_MD *sign_md = NULL; - const char *CAfile = NULL, *CApath = NULL, *prog = NULL; - char *certfile = NULL, *keyfile = NULL, *contfile = NULL; - char *infile = NULL, *outfile = NULL, *signerfile = NULL, *recipfile = NULL; - char *passinarg = NULL, *passin = NULL, *to = NULL, *from = NULL, *subject = NULL; - OPTION_CHOICE o; - int noCApath = 0, noCAfile = 0; - int flags = PKCS7_DETACHED, operation = 0, ret = 0, indef = 0; - int informat = FORMAT_SMIME, outformat = FORMAT_SMIME, keyform = - FORMAT_PEM; - int vpmtouched = 0, rv = 0; - ENGINE *e = NULL; - const char *mime_eol = "\n"; - - if ((vpm = X509_VERIFY_PARAM_new()) == NULL) - return 1; - - prog = opt_init(argc, argv, smime_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(smime_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDS, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDS, &outformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_ENCRYPT: - operation = SMIME_ENCRYPT; - break; - case OPT_DECRYPT: - operation = SMIME_DECRYPT; - break; - case OPT_SIGN: - operation = SMIME_SIGN; - break; - case OPT_RESIGN: - operation = SMIME_RESIGN; - break; - case OPT_VERIFY: - operation = SMIME_VERIFY; - break; - case OPT_PK7OUT: - operation = SMIME_PK7OUT; - break; - case OPT_TEXT: - flags |= PKCS7_TEXT; - break; - case OPT_NOINTERN: - flags |= PKCS7_NOINTERN; - break; - case OPT_NOVERIFY: - flags |= PKCS7_NOVERIFY; - break; - case OPT_NOCHAIN: - flags |= PKCS7_NOCHAIN; - break; - case OPT_NOCERTS: - flags |= PKCS7_NOCERTS; - break; - case OPT_NOATTR: - flags |= PKCS7_NOATTR; - break; - case OPT_NODETACH: - flags &= ~PKCS7_DETACHED; - break; - case OPT_NOSMIMECAP: - flags |= PKCS7_NOSMIMECAP; - break; - case OPT_BINARY: - flags |= PKCS7_BINARY; - break; - case OPT_NOSIGS: - flags |= PKCS7_NOSIGS; - break; - case OPT_STREAM: - case OPT_INDEF: - indef = 1; - break; - case OPT_NOINDEF: - indef = 0; - break; - case OPT_CRLFEOL: - flags |= PKCS7_CRLFEOL; - mime_eol = "\r\n"; - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_TO: - to = opt_arg(); - break; - case OPT_FROM: - from = opt_arg(); - break; - case OPT_SUBJECT: - subject = opt_arg(); - break; - case OPT_SIGNER: - /* If previous -signer argument add signer to list */ - if (signerfile != NULL) { - if (sksigners == NULL - && (sksigners = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(sksigners, signerfile); - if (keyfile == NULL) - keyfile = signerfile; - if (skkeys == NULL - && (skkeys = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(skkeys, keyfile); - keyfile = NULL; - } - signerfile = opt_arg(); - break; - case OPT_RECIP: - recipfile = opt_arg(); - break; - case OPT_MD: - if (!opt_md(opt_arg(), &sign_md)) - goto opthelp; - break; - case OPT_CIPHER: - if (!opt_cipher(opt_unknown(), &cipher)) - goto opthelp; - break; - case OPT_INKEY: - /* If previous -inkey argument add signer to list */ - if (keyfile != NULL) { - if (signerfile == NULL) { - BIO_printf(bio_err, - "%s: Must have -signer before -inkey\n", prog); - goto opthelp; - } - if (sksigners == NULL - && (sksigners = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(sksigners, signerfile); - signerfile = NULL; - if (skkeys == NULL - && (skkeys = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(skkeys, keyfile); - } - keyfile = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyform)) - goto opthelp; - break; - case OPT_CERTFILE: - certfile = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_CONTENT: - contfile = opt_arg(); - break; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto opthelp; - vpmtouched++; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (!(operation & SMIME_SIGNERS) && (skkeys != NULL || sksigners != NULL)) { - BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); - goto opthelp; - } - - if (operation & SMIME_SIGNERS) { - /* Check to see if any final signer needs to be appended */ - if (keyfile && !signerfile) { - BIO_puts(bio_err, "Illegal -inkey without -signer\n"); - goto opthelp; - } - if (signerfile != NULL) { - if (sksigners == NULL - && (sksigners = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - sk_OPENSSL_STRING_push(sksigners, signerfile); - if (!skkeys && (skkeys = sk_OPENSSL_STRING_new_null()) == NULL) - goto end; - if (!keyfile) - keyfile = signerfile; - sk_OPENSSL_STRING_push(skkeys, keyfile); - } - if (sksigners == NULL) { - BIO_printf(bio_err, "No signer certificate specified\n"); - goto opthelp; - } - signerfile = NULL; - keyfile = NULL; - } else if (operation == SMIME_DECRYPT) { - if (recipfile == NULL && keyfile == NULL) { - BIO_printf(bio_err, - "No recipient certificate or key specified\n"); - goto opthelp; - } - } else if (operation == SMIME_ENCRYPT) { - if (argc == 0) { - BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n"); - goto opthelp; - } - } else if (!operation) { - goto opthelp; - } - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - ret = 2; - - if (!(operation & SMIME_SIGNERS)) - flags &= ~PKCS7_DETACHED; - - if (!(operation & SMIME_OP)) { - if (flags & PKCS7_BINARY) - outformat = FORMAT_BINARY; - } - - if (!(operation & SMIME_IP)) { - if (flags & PKCS7_BINARY) - informat = FORMAT_BINARY; - } - - if (operation == SMIME_ENCRYPT) { - if (cipher == NULL) { -#ifndef OPENSSL_NO_DES - cipher = EVP_des_ede3_cbc(); -#else - BIO_printf(bio_err, "No cipher selected\n"); - goto end; -#endif - } - encerts = sk_X509_new_null(); - if (encerts == NULL) - goto end; - while (*argv != NULL) { - cert = load_cert(*argv, FORMAT_PEM, - "recipient certificate file"); - if (cert == NULL) - goto end; - sk_X509_push(encerts, cert); - cert = NULL; - argv++; - } - } - - if (certfile != NULL) { - if (!load_certs(certfile, &other, FORMAT_PEM, NULL, - "certificate file")) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (recipfile != NULL && (operation == SMIME_DECRYPT)) { - if ((recip = load_cert(recipfile, FORMAT_PEM, - "recipient certificate file")) == NULL) { - ERR_print_errors(bio_err); - goto end; - } - } - - if (operation == SMIME_DECRYPT) { - if (keyfile == NULL) - keyfile = recipfile; - } else if (operation == SMIME_SIGN) { - if (keyfile == NULL) - keyfile = signerfile; - } else { - keyfile = NULL; - } - - if (keyfile != NULL) { - key = load_key(keyfile, keyform, 0, passin, e, "signing key file"); - if (key == NULL) - goto end; - } - - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - - if (operation & SMIME_IP) { - if (informat == FORMAT_SMIME) { - p7 = SMIME_read_PKCS7(in, &indata); - } else if (informat == FORMAT_PEM) { - p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL); - } else if (informat == FORMAT_ASN1) { - p7 = d2i_PKCS7_bio(in, NULL); - } else { - BIO_printf(bio_err, "Bad input format for PKCS#7 file\n"); - goto end; - } - - if (p7 == NULL) { - BIO_printf(bio_err, "Error reading S/MIME message\n"); - goto end; - } - if (contfile != NULL) { - BIO_free(indata); - if ((indata = BIO_new_file(contfile, "rb")) == NULL) { - BIO_printf(bio_err, "Can't read content file %s\n", contfile); - goto end; - } - } - } - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if (operation == SMIME_VERIFY) { - if ((store = setup_verify(CAfile, CApath, noCAfile, noCApath)) == NULL) - goto end; - X509_STORE_set_verify_cb(store, smime_cb); - if (vpmtouched) - X509_STORE_set1_param(store, vpm); - } - - ret = 3; - - if (operation == SMIME_ENCRYPT) { - if (indef) - flags |= PKCS7_STREAM; - p7 = PKCS7_encrypt(encerts, in, cipher, flags); - } else if (operation & SMIME_SIGNERS) { - int i; - /* - * If detached data content we only enable streaming if S/MIME output - * format. - */ - if (operation == SMIME_SIGN) { - if (flags & PKCS7_DETACHED) { - if (outformat == FORMAT_SMIME) - flags |= PKCS7_STREAM; - } else if (indef) { - flags |= PKCS7_STREAM; - } - flags |= PKCS7_PARTIAL; - p7 = PKCS7_sign(NULL, NULL, other, in, flags); - if (p7 == NULL) - goto end; - if (flags & PKCS7_NOCERTS) { - for (i = 0; i < sk_X509_num(other); i++) { - X509 *x = sk_X509_value(other, i); - PKCS7_add_certificate(p7, x); - } - } - } else { - flags |= PKCS7_REUSE_DIGEST; - } - for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) { - signerfile = sk_OPENSSL_STRING_value(sksigners, i); - keyfile = sk_OPENSSL_STRING_value(skkeys, i); - signer = load_cert(signerfile, FORMAT_PEM, - "signer certificate"); - if (signer == NULL) - goto end; - key = load_key(keyfile, keyform, 0, passin, e, "signing key file"); - if (key == NULL) - goto end; - if (!PKCS7_sign_add_signer(p7, signer, key, sign_md, flags)) - goto end; - X509_free(signer); - signer = NULL; - EVP_PKEY_free(key); - key = NULL; - } - /* If not streaming or resigning finalize structure */ - if ((operation == SMIME_SIGN) && !(flags & PKCS7_STREAM)) { - if (!PKCS7_final(p7, in, flags)) - goto end; - } - } - - if (p7 == NULL) { - BIO_printf(bio_err, "Error creating PKCS#7 structure\n"); - goto end; - } - - ret = 4; - if (operation == SMIME_DECRYPT) { - if (!PKCS7_decrypt(p7, key, recip, out, flags)) { - BIO_printf(bio_err, "Error decrypting PKCS#7 structure\n"); - goto end; - } - } else if (operation == SMIME_VERIFY) { - STACK_OF(X509) *signers; - if (PKCS7_verify(p7, other, store, indata, out, flags)) - BIO_printf(bio_err, "Verification successful\n"); - else { - BIO_printf(bio_err, "Verification failure\n"); - goto end; - } - signers = PKCS7_get0_signers(p7, other, flags); - if (!save_certs(signerfile, signers)) { - BIO_printf(bio_err, "Error writing signers to %s\n", signerfile); - ret = 5; - goto end; - } - sk_X509_free(signers); - } else if (operation == SMIME_PK7OUT) { - PEM_write_bio_PKCS7(out, p7); - } else { - if (to) - BIO_printf(out, "To: %s%s", to, mime_eol); - if (from) - BIO_printf(out, "From: %s%s", from, mime_eol); - if (subject) - BIO_printf(out, "Subject: %s%s", subject, mime_eol); - if (outformat == FORMAT_SMIME) { - if (operation == SMIME_RESIGN) - rv = SMIME_write_PKCS7(out, p7, indata, flags); - else - rv = SMIME_write_PKCS7(out, p7, in, flags); - } else if (outformat == FORMAT_PEM) { - rv = PEM_write_bio_PKCS7_stream(out, p7, in, flags); - } else if (outformat == FORMAT_ASN1) { - rv = i2d_PKCS7_bio_stream(out, p7, in, flags); - } else { - BIO_printf(bio_err, "Bad output format for PKCS#7 file\n"); - goto end; - } - if (rv == 0) { - BIO_printf(bio_err, "Error writing output\n"); - ret = 3; - goto end; - } - } - ret = 0; - end: - if (ret) - ERR_print_errors(bio_err); - sk_X509_pop_free(encerts, X509_free); - sk_X509_pop_free(other, X509_free); - X509_VERIFY_PARAM_free(vpm); - sk_OPENSSL_STRING_free(sksigners); - sk_OPENSSL_STRING_free(skkeys); - X509_STORE_free(store); - X509_free(cert); - X509_free(recip); - X509_free(signer); - EVP_PKEY_free(key); - PKCS7_free(p7); - release_engine(e); - BIO_free(in); - BIO_free(indata); - BIO_free_all(out); - OPENSSL_free(passin); - return ret; -} - -static int save_certs(char *signerfile, STACK_OF(X509) *signers) -{ - int i; - BIO *tmp; - - if (signerfile == NULL) - return 1; - tmp = BIO_new_file(signerfile, "w"); - if (tmp == NULL) - return 0; - for (i = 0; i < sk_X509_num(signers); i++) - PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); - BIO_free(tmp); - return 1; -} - -/* Minimal callback just to output policy info (if any) */ - -static int smime_cb(int ok, X509_STORE_CTX *ctx) -{ - int error; - - error = X509_STORE_CTX_get_error(ctx); - - if ((error != X509_V_ERR_NO_EXPLICIT_POLICY) - && ((error != X509_V_OK) || (ok != 2))) - return ok; - - policies_print(ctx); - - return ok; -} diff --git a/contrib/libs/openssl/apps/speed.c b/contrib/libs/openssl/apps/speed.c deleted file mode 100644 index d4ae7ab7bf..0000000000 --- a/contrib/libs/openssl/apps/speed.c +++ /dev/null @@ -1,3719 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#undef SECONDS -#define SECONDS 3 -#define RSA_SECONDS 10 -#define DSA_SECONDS 10 -#define ECDSA_SECONDS 10 -#define ECDH_SECONDS 10 -#define EdDSA_SECONDS 10 - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include "apps.h" -#include "progs.h" -#include <openssl/crypto.h> -#include <openssl/rand.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/objects.h> -#include <openssl/async.h> -#if !defined(OPENSSL_SYS_MSDOS) -# include OPENSSL_UNISTD -#endif - -#if defined(_WIN32) -# include <windows.h> -#endif - -#include <openssl/bn.h> -#ifndef OPENSSL_NO_DES -# include <openssl/des.h> -#endif -#include <openssl/aes.h> -#ifndef OPENSSL_NO_CAMELLIA -# include <openssl/camellia.h> -#endif -#ifndef OPENSSL_NO_MD2 -# include <openssl/md2.h> -#endif -#ifndef OPENSSL_NO_MDC2 -# include <openssl/mdc2.h> -#endif -#ifndef OPENSSL_NO_MD4 -# include <openssl/md4.h> -#endif -#ifndef OPENSSL_NO_MD5 -# include <openssl/md5.h> -#endif -#include <openssl/hmac.h> -#include <openssl/sha.h> -#ifndef OPENSSL_NO_RMD160 -# include <openssl/ripemd.h> -#endif -#ifndef OPENSSL_NO_WHIRLPOOL -# include <openssl/whrlpool.h> -#endif -#ifndef OPENSSL_NO_RC4 -# include <openssl/rc4.h> -#endif -#ifndef OPENSSL_NO_RC5 -# include <openssl/rc5.h> -#endif -#ifndef OPENSSL_NO_RC2 -# include <openssl/rc2.h> -#endif -#ifndef OPENSSL_NO_IDEA -# include <openssl/idea.h> -#endif -#ifndef OPENSSL_NO_SEED -# include <openssl/seed.h> -#endif -#ifndef OPENSSL_NO_BF -# include <openssl/blowfish.h> -#endif -#ifndef OPENSSL_NO_CAST -# include <openssl/cast.h> -#endif -#ifndef OPENSSL_NO_RSA -# include <openssl/rsa.h> -# include "./testrsa.h" -#endif -#include <openssl/x509.h> -#ifndef OPENSSL_NO_DSA -# include <openssl/dsa.h> -# include "./testdsa.h" -#endif -#ifndef OPENSSL_NO_EC -# include <openssl/ec.h> -#endif -#include <openssl/modes.h> - -#ifndef HAVE_FORK -# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_VXWORKS) -# define HAVE_FORK 0 -# else -# define HAVE_FORK 1 -# endif -#endif - -#if HAVE_FORK -# undef NO_FORK -#else -# define NO_FORK -#endif - -#define MAX_MISALIGNMENT 63 -#define MAX_ECDH_SIZE 256 -#define MISALIGN 64 - -typedef struct openssl_speed_sec_st { - int sym; - int rsa; - int dsa; - int ecdsa; - int ecdh; - int eddsa; -} openssl_speed_sec_t; - -static volatile int run = 0; - -static int mr = 0; -static int usertime = 1; - -#ifndef OPENSSL_NO_MD2 -static int EVP_Digest_MD2_loop(void *args); -#endif - -#ifndef OPENSSL_NO_MDC2 -static int EVP_Digest_MDC2_loop(void *args); -#endif -#ifndef OPENSSL_NO_MD4 -static int EVP_Digest_MD4_loop(void *args); -#endif -#ifndef OPENSSL_NO_MD5 -static int MD5_loop(void *args); -static int HMAC_loop(void *args); -#endif -static int SHA1_loop(void *args); -static int SHA256_loop(void *args); -static int SHA512_loop(void *args); -#ifndef OPENSSL_NO_WHIRLPOOL -static int WHIRLPOOL_loop(void *args); -#endif -#ifndef OPENSSL_NO_RMD160 -static int EVP_Digest_RMD160_loop(void *args); -#endif -#ifndef OPENSSL_NO_RC4 -static int RC4_loop(void *args); -#endif -#ifndef OPENSSL_NO_DES -static int DES_ncbc_encrypt_loop(void *args); -static int DES_ede3_cbc_encrypt_loop(void *args); -#endif -static int AES_cbc_128_encrypt_loop(void *args); -static int AES_cbc_192_encrypt_loop(void *args); -static int AES_ige_128_encrypt_loop(void *args); -static int AES_cbc_256_encrypt_loop(void *args); -static int AES_ige_192_encrypt_loop(void *args); -static int AES_ige_256_encrypt_loop(void *args); -static int CRYPTO_gcm128_aad_loop(void *args); -static int RAND_bytes_loop(void *args); -static int EVP_Update_loop(void *args); -static int EVP_Update_loop_ccm(void *args); -static int EVP_Update_loop_aead(void *args); -static int EVP_Digest_loop(void *args); -#ifndef OPENSSL_NO_RSA -static int RSA_sign_loop(void *args); -static int RSA_verify_loop(void *args); -#endif -#ifndef OPENSSL_NO_DSA -static int DSA_sign_loop(void *args); -static int DSA_verify_loop(void *args); -#endif -#ifndef OPENSSL_NO_EC -static int ECDSA_sign_loop(void *args); -static int ECDSA_verify_loop(void *args); -static int EdDSA_sign_loop(void *args); -static int EdDSA_verify_loop(void *args); -#endif - -static double Time_F(int s); -static void print_message(const char *s, long num, int length, int tm); -static void pkey_print_message(const char *str, const char *str2, - long num, unsigned int bits, int sec); -static void print_result(int alg, int run_no, int count, double time_used); -#ifndef NO_FORK -static int do_multi(int multi, int size_num); -#endif - -static const int lengths_list[] = { - 16, 64, 256, 1024, 8 * 1024, 16 * 1024 -}; -static const int *lengths = lengths_list; - -static const int aead_lengths_list[] = { - 2, 31, 136, 1024, 8 * 1024, 16 * 1024 -}; - -#define START 0 -#define STOP 1 - -#ifdef SIGALRM - -static void alarmed(int sig) -{ - signal(SIGALRM, alarmed); - run = 0; -} - -static double Time_F(int s) -{ - double ret = app_tminterval(s, usertime); - if (s == STOP) - alarm(0); - return ret; -} - -#elif defined(_WIN32) - -# define SIGALRM -1 - -static unsigned int lapse; -static volatile unsigned int schlock; -static void alarm_win32(unsigned int secs) -{ - lapse = secs * 1000; -} - -# define alarm alarm_win32 - -static DWORD WINAPI sleepy(VOID * arg) -{ - schlock = 1; - Sleep(lapse); - run = 0; - return 0; -} - -static double Time_F(int s) -{ - double ret; - static HANDLE thr; - - if (s == START) { - schlock = 0; - thr = CreateThread(NULL, 4096, sleepy, NULL, 0, NULL); - if (thr == NULL) { - DWORD err = GetLastError(); - BIO_printf(bio_err, "unable to CreateThread (%lu)", err); - ExitProcess(err); - } - while (!schlock) - Sleep(0); /* scheduler spinlock */ - ret = app_tminterval(s, usertime); - } else { - ret = app_tminterval(s, usertime); - if (run) - TerminateThread(thr, 0); - CloseHandle(thr); - } - - return ret; -} -#else -static double Time_F(int s) -{ - return app_tminterval(s, usertime); -} -#endif - -static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single, - const openssl_speed_sec_t *seconds); - -#define found(value, pairs, result)\ - opt_found(value, result, pairs, OSSL_NELEM(pairs)) -static int opt_found(const char *name, unsigned int *result, - const OPT_PAIR pairs[], unsigned int nbelem) -{ - unsigned int idx; - - for (idx = 0; idx < nbelem; ++idx, pairs++) - if (strcmp(name, pairs->name) == 0) { - *result = pairs->retval; - return 1; - } - return 0; -} - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ELAPSED, OPT_EVP, OPT_DECRYPT, OPT_ENGINE, OPT_MULTI, - OPT_MR, OPT_MB, OPT_MISALIGN, OPT_ASYNCJOBS, OPT_R_ENUM, - OPT_PRIMES, OPT_SECONDS, OPT_BYTES, OPT_AEAD -} OPTION_CHOICE; - -const OPTIONS speed_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] ciphers...\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"evp", OPT_EVP, 's', "Use EVP-named cipher or digest"}, - {"decrypt", OPT_DECRYPT, '-', - "Time decryption instead of encryption (only EVP)"}, - {"aead", OPT_AEAD, '-', - "Benchmark EVP-named AEAD cipher in TLS-like sequence"}, - {"mb", OPT_MB, '-', - "Enable (tls1>=1) multi-block mode on EVP-named cipher"}, - {"mr", OPT_MR, '-', "Produce machine readable output"}, -#ifndef NO_FORK - {"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"}, -#endif -#ifndef OPENSSL_NO_ASYNC - {"async_jobs", OPT_ASYNCJOBS, 'p', - "Enable async mode and start specified number of jobs"}, -#endif - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"elapsed", OPT_ELAPSED, '-', - "Use wall-clock time instead of CPU user time as divisor"}, - {"primes", OPT_PRIMES, 'p', "Specify number of primes (for RSA only)"}, - {"seconds", OPT_SECONDS, 'p', - "Run benchmarks for specified amount of seconds"}, - {"bytes", OPT_BYTES, 'p', - "Run [non-PKI] benchmarks on custom-sized buffer"}, - {"misalign", OPT_MISALIGN, 'p', - "Use specified offset to mis-align buffers"}, - {NULL} -}; - -#define D_MD2 0 -#define D_MDC2 1 -#define D_MD4 2 -#define D_MD5 3 -#define D_HMAC 4 -#define D_SHA1 5 -#define D_RMD160 6 -#define D_RC4 7 -#define D_CBC_DES 8 -#define D_EDE3_DES 9 -#define D_CBC_IDEA 10 -#define D_CBC_SEED 11 -#define D_CBC_RC2 12 -#define D_CBC_RC5 13 -#define D_CBC_BF 14 -#define D_CBC_CAST 15 -#define D_CBC_128_AES 16 -#define D_CBC_192_AES 17 -#define D_CBC_256_AES 18 -#define D_CBC_128_CML 19 -#define D_CBC_192_CML 20 -#define D_CBC_256_CML 21 -#define D_EVP 22 -#define D_SHA256 23 -#define D_SHA512 24 -#define D_WHIRLPOOL 25 -#define D_IGE_128_AES 26 -#define D_IGE_192_AES 27 -#define D_IGE_256_AES 28 -#define D_GHASH 29 -#define D_RAND 30 -/* name of algorithms to test */ -static const char *names[] = { - "md2", "mdc2", "md4", "md5", "hmac(md5)", "sha1", "rmd160", "rc4", - "des cbc", "des ede3", "idea cbc", "seed cbc", - "rc2 cbc", "rc5-32/12 cbc", "blowfish cbc", "cast cbc", - "aes-128 cbc", "aes-192 cbc", "aes-256 cbc", - "camellia-128 cbc", "camellia-192 cbc", "camellia-256 cbc", - "evp", "sha256", "sha512", "whirlpool", - "aes-128 ige", "aes-192 ige", "aes-256 ige", "ghash", - "rand" -}; -#define ALGOR_NUM OSSL_NELEM(names) - -/* list of configured algorithm (remaining) */ -static const OPT_PAIR doit_choices[] = { -#ifndef OPENSSL_NO_MD2 - {"md2", D_MD2}, -#endif -#ifndef OPENSSL_NO_MDC2 - {"mdc2", D_MDC2}, -#endif -#ifndef OPENSSL_NO_MD4 - {"md4", D_MD4}, -#endif -#ifndef OPENSSL_NO_MD5 - {"md5", D_MD5}, - {"hmac", D_HMAC}, -#endif - {"sha1", D_SHA1}, - {"sha256", D_SHA256}, - {"sha512", D_SHA512}, -#ifndef OPENSSL_NO_WHIRLPOOL - {"whirlpool", D_WHIRLPOOL}, -#endif -#ifndef OPENSSL_NO_RMD160 - {"ripemd", D_RMD160}, - {"rmd160", D_RMD160}, - {"ripemd160", D_RMD160}, -#endif -#ifndef OPENSSL_NO_RC4 - {"rc4", D_RC4}, -#endif -#ifndef OPENSSL_NO_DES - {"des-cbc", D_CBC_DES}, - {"des-ede3", D_EDE3_DES}, -#endif - {"aes-128-cbc", D_CBC_128_AES}, - {"aes-192-cbc", D_CBC_192_AES}, - {"aes-256-cbc", D_CBC_256_AES}, - {"aes-128-ige", D_IGE_128_AES}, - {"aes-192-ige", D_IGE_192_AES}, - {"aes-256-ige", D_IGE_256_AES}, -#ifndef OPENSSL_NO_RC2 - {"rc2-cbc", D_CBC_RC2}, - {"rc2", D_CBC_RC2}, -#endif -#ifndef OPENSSL_NO_RC5 - {"rc5-cbc", D_CBC_RC5}, - {"rc5", D_CBC_RC5}, -#endif -#ifndef OPENSSL_NO_IDEA - {"idea-cbc", D_CBC_IDEA}, - {"idea", D_CBC_IDEA}, -#endif -#ifndef OPENSSL_NO_SEED - {"seed-cbc", D_CBC_SEED}, - {"seed", D_CBC_SEED}, -#endif -#ifndef OPENSSL_NO_BF - {"bf-cbc", D_CBC_BF}, - {"blowfish", D_CBC_BF}, - {"bf", D_CBC_BF}, -#endif -#ifndef OPENSSL_NO_CAST - {"cast-cbc", D_CBC_CAST}, - {"cast", D_CBC_CAST}, - {"cast5", D_CBC_CAST}, -#endif - {"ghash", D_GHASH}, - {"rand", D_RAND} -}; - -static double results[ALGOR_NUM][OSSL_NELEM(lengths_list)]; - -#ifndef OPENSSL_NO_DSA -# define R_DSA_512 0 -# define R_DSA_1024 1 -# define R_DSA_2048 2 -static const OPT_PAIR dsa_choices[] = { - {"dsa512", R_DSA_512}, - {"dsa1024", R_DSA_1024}, - {"dsa2048", R_DSA_2048} -}; -# define DSA_NUM OSSL_NELEM(dsa_choices) - -static double dsa_results[DSA_NUM][2]; /* 2 ops: sign then verify */ -#endif /* OPENSSL_NO_DSA */ - -#define R_RSA_512 0 -#define R_RSA_1024 1 -#define R_RSA_2048 2 -#define R_RSA_3072 3 -#define R_RSA_4096 4 -#define R_RSA_7680 5 -#define R_RSA_15360 6 -#ifndef OPENSSL_NO_RSA -static const OPT_PAIR rsa_choices[] = { - {"rsa512", R_RSA_512}, - {"rsa1024", R_RSA_1024}, - {"rsa2048", R_RSA_2048}, - {"rsa3072", R_RSA_3072}, - {"rsa4096", R_RSA_4096}, - {"rsa7680", R_RSA_7680}, - {"rsa15360", R_RSA_15360} -}; -# define RSA_NUM OSSL_NELEM(rsa_choices) - -static double rsa_results[RSA_NUM][2]; /* 2 ops: sign then verify */ -#endif /* OPENSSL_NO_RSA */ - -enum { - R_EC_P160, - R_EC_P192, - R_EC_P224, - R_EC_P256, - R_EC_P384, - R_EC_P521, -#ifndef OPENSSL_NO_EC2M - R_EC_K163, - R_EC_K233, - R_EC_K283, - R_EC_K409, - R_EC_K571, - R_EC_B163, - R_EC_B233, - R_EC_B283, - R_EC_B409, - R_EC_B571, -#endif - R_EC_BRP256R1, - R_EC_BRP256T1, - R_EC_BRP384R1, - R_EC_BRP384T1, - R_EC_BRP512R1, - R_EC_BRP512T1, - R_EC_X25519, - R_EC_X448 -}; - -#ifndef OPENSSL_NO_EC -static OPT_PAIR ecdsa_choices[] = { - {"ecdsap160", R_EC_P160}, - {"ecdsap192", R_EC_P192}, - {"ecdsap224", R_EC_P224}, - {"ecdsap256", R_EC_P256}, - {"ecdsap384", R_EC_P384}, - {"ecdsap521", R_EC_P521}, -# ifndef OPENSSL_NO_EC2M - {"ecdsak163", R_EC_K163}, - {"ecdsak233", R_EC_K233}, - {"ecdsak283", R_EC_K283}, - {"ecdsak409", R_EC_K409}, - {"ecdsak571", R_EC_K571}, - {"ecdsab163", R_EC_B163}, - {"ecdsab233", R_EC_B233}, - {"ecdsab283", R_EC_B283}, - {"ecdsab409", R_EC_B409}, - {"ecdsab571", R_EC_B571}, -# endif - {"ecdsabrp256r1", R_EC_BRP256R1}, - {"ecdsabrp256t1", R_EC_BRP256T1}, - {"ecdsabrp384r1", R_EC_BRP384R1}, - {"ecdsabrp384t1", R_EC_BRP384T1}, - {"ecdsabrp512r1", R_EC_BRP512R1}, - {"ecdsabrp512t1", R_EC_BRP512T1} -}; -# define ECDSA_NUM OSSL_NELEM(ecdsa_choices) - -static double ecdsa_results[ECDSA_NUM][2]; /* 2 ops: sign then verify */ - -static const OPT_PAIR ecdh_choices[] = { - {"ecdhp160", R_EC_P160}, - {"ecdhp192", R_EC_P192}, - {"ecdhp224", R_EC_P224}, - {"ecdhp256", R_EC_P256}, - {"ecdhp384", R_EC_P384}, - {"ecdhp521", R_EC_P521}, -# ifndef OPENSSL_NO_EC2M - {"ecdhk163", R_EC_K163}, - {"ecdhk233", R_EC_K233}, - {"ecdhk283", R_EC_K283}, - {"ecdhk409", R_EC_K409}, - {"ecdhk571", R_EC_K571}, - {"ecdhb163", R_EC_B163}, - {"ecdhb233", R_EC_B233}, - {"ecdhb283", R_EC_B283}, - {"ecdhb409", R_EC_B409}, - {"ecdhb571", R_EC_B571}, -# endif - {"ecdhbrp256r1", R_EC_BRP256R1}, - {"ecdhbrp256t1", R_EC_BRP256T1}, - {"ecdhbrp384r1", R_EC_BRP384R1}, - {"ecdhbrp384t1", R_EC_BRP384T1}, - {"ecdhbrp512r1", R_EC_BRP512R1}, - {"ecdhbrp512t1", R_EC_BRP512T1}, - {"ecdhx25519", R_EC_X25519}, - {"ecdhx448", R_EC_X448} -}; -# define EC_NUM OSSL_NELEM(ecdh_choices) - -static double ecdh_results[EC_NUM][1]; /* 1 op: derivation */ - -#define R_EC_Ed25519 0 -#define R_EC_Ed448 1 -static OPT_PAIR eddsa_choices[] = { - {"ed25519", R_EC_Ed25519}, - {"ed448", R_EC_Ed448} -}; -# define EdDSA_NUM OSSL_NELEM(eddsa_choices) - -static double eddsa_results[EdDSA_NUM][2]; /* 2 ops: sign then verify */ -#endif /* OPENSSL_NO_EC */ - -#ifndef SIGALRM -# define COND(d) (count < (d)) -# define COUNT(d) (d) -#else -# define COND(unused_cond) (run && count<0x7fffffff) -# define COUNT(d) (count) -#endif /* SIGALRM */ - -typedef struct loopargs_st { - ASYNC_JOB *inprogress_job; - ASYNC_WAIT_CTX *wait_ctx; - unsigned char *buf; - unsigned char *buf2; - unsigned char *buf_malloc; - unsigned char *buf2_malloc; - unsigned char *key; - unsigned int siglen; - size_t sigsize; -#ifndef OPENSSL_NO_RSA - RSA *rsa_key[RSA_NUM]; -#endif -#ifndef OPENSSL_NO_DSA - DSA *dsa_key[DSA_NUM]; -#endif -#ifndef OPENSSL_NO_EC - EC_KEY *ecdsa[ECDSA_NUM]; - EVP_PKEY_CTX *ecdh_ctx[EC_NUM]; - EVP_MD_CTX *eddsa_ctx[EdDSA_NUM]; - unsigned char *secret_a; - unsigned char *secret_b; - size_t outlen[EC_NUM]; -#endif - EVP_CIPHER_CTX *ctx; - HMAC_CTX *hctx; - GCM128_CONTEXT *gcm_ctx; -} loopargs_t; -static int run_benchmark(int async_jobs, int (*loop_function) (void *), - loopargs_t * loopargs); - -static unsigned int testnum; - -/* Nb of iterations to do per algorithm and key-size */ -static long c[ALGOR_NUM][OSSL_NELEM(lengths_list)]; - -#ifndef OPENSSL_NO_MD2 -static int EVP_Digest_MD2_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char md2[MD2_DIGEST_LENGTH]; - int count; - - for (count = 0; COND(c[D_MD2][testnum]); count++) { - if (!EVP_Digest(buf, (size_t)lengths[testnum], md2, NULL, EVP_md2(), - NULL)) - return -1; - } - return count; -} -#endif - -#ifndef OPENSSL_NO_MDC2 -static int EVP_Digest_MDC2_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char mdc2[MDC2_DIGEST_LENGTH]; - int count; - - for (count = 0; COND(c[D_MDC2][testnum]); count++) { - if (!EVP_Digest(buf, (size_t)lengths[testnum], mdc2, NULL, EVP_mdc2(), - NULL)) - return -1; - } - return count; -} -#endif - -#ifndef OPENSSL_NO_MD4 -static int EVP_Digest_MD4_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char md4[MD4_DIGEST_LENGTH]; - int count; - - for (count = 0; COND(c[D_MD4][testnum]); count++) { - if (!EVP_Digest(buf, (size_t)lengths[testnum], md4, NULL, EVP_md4(), - NULL)) - return -1; - } - return count; -} -#endif - -#ifndef OPENSSL_NO_MD5 -static int MD5_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char md5[MD5_DIGEST_LENGTH]; - int count; - for (count = 0; COND(c[D_MD5][testnum]); count++) - MD5(buf, lengths[testnum], md5); - return count; -} - -static int HMAC_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - HMAC_CTX *hctx = tempargs->hctx; - unsigned char hmac[MD5_DIGEST_LENGTH]; - int count; - - for (count = 0; COND(c[D_HMAC][testnum]); count++) { - HMAC_Init_ex(hctx, NULL, 0, NULL, NULL); - HMAC_Update(hctx, buf, lengths[testnum]); - HMAC_Final(hctx, hmac, NULL); - } - return count; -} -#endif - -static int SHA1_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char sha[SHA_DIGEST_LENGTH]; - int count; - for (count = 0; COND(c[D_SHA1][testnum]); count++) - SHA1(buf, lengths[testnum], sha); - return count; -} - -static int SHA256_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char sha256[SHA256_DIGEST_LENGTH]; - int count; - for (count = 0; COND(c[D_SHA256][testnum]); count++) - SHA256(buf, lengths[testnum], sha256); - return count; -} - -static int SHA512_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char sha512[SHA512_DIGEST_LENGTH]; - int count; - for (count = 0; COND(c[D_SHA512][testnum]); count++) - SHA512(buf, lengths[testnum], sha512); - return count; -} - -#ifndef OPENSSL_NO_WHIRLPOOL -static int WHIRLPOOL_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char whirlpool[WHIRLPOOL_DIGEST_LENGTH]; - int count; - for (count = 0; COND(c[D_WHIRLPOOL][testnum]); count++) - WHIRLPOOL(buf, lengths[testnum], whirlpool); - return count; -} -#endif - -#ifndef OPENSSL_NO_RMD160 -static int EVP_Digest_RMD160_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char rmd160[RIPEMD160_DIGEST_LENGTH]; - int count; - for (count = 0; COND(c[D_RMD160][testnum]); count++) { - if (!EVP_Digest(buf, (size_t)lengths[testnum], &(rmd160[0]), - NULL, EVP_ripemd160(), NULL)) - return -1; - } - return count; -} -#endif - -#ifndef OPENSSL_NO_RC4 -static RC4_KEY rc4_ks; -static int RC4_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - for (count = 0; COND(c[D_RC4][testnum]); count++) - RC4(&rc4_ks, (size_t)lengths[testnum], buf, buf); - return count; -} -#endif - -#ifndef OPENSSL_NO_DES -static unsigned char DES_iv[8]; -static DES_key_schedule sch; -static DES_key_schedule sch2; -static DES_key_schedule sch3; -static int DES_ncbc_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - for (count = 0; COND(c[D_CBC_DES][testnum]); count++) - DES_ncbc_encrypt(buf, buf, lengths[testnum], &sch, - &DES_iv, DES_ENCRYPT); - return count; -} - -static int DES_ede3_cbc_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - for (count = 0; COND(c[D_EDE3_DES][testnum]); count++) - DES_ede3_cbc_encrypt(buf, buf, lengths[testnum], - &sch, &sch2, &sch3, &DES_iv, DES_ENCRYPT); - return count; -} -#endif - -#define MAX_BLOCK_SIZE 128 - -static unsigned char iv[2 * MAX_BLOCK_SIZE / 8]; -static AES_KEY aes_ks1, aes_ks2, aes_ks3; -static int AES_cbc_128_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - for (count = 0; COND(c[D_CBC_128_AES][testnum]); count++) - AES_cbc_encrypt(buf, buf, - (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT); - return count; -} - -static int AES_cbc_192_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - for (count = 0; COND(c[D_CBC_192_AES][testnum]); count++) - AES_cbc_encrypt(buf, buf, - (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT); - return count; -} - -static int AES_cbc_256_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - for (count = 0; COND(c[D_CBC_256_AES][testnum]); count++) - AES_cbc_encrypt(buf, buf, - (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT); - return count; -} - -static int AES_ige_128_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - int count; - for (count = 0; COND(c[D_IGE_128_AES][testnum]); count++) - AES_ige_encrypt(buf, buf2, - (size_t)lengths[testnum], &aes_ks1, iv, AES_ENCRYPT); - return count; -} - -static int AES_ige_192_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - int count; - for (count = 0; COND(c[D_IGE_192_AES][testnum]); count++) - AES_ige_encrypt(buf, buf2, - (size_t)lengths[testnum], &aes_ks2, iv, AES_ENCRYPT); - return count; -} - -static int AES_ige_256_encrypt_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - int count; - for (count = 0; COND(c[D_IGE_256_AES][testnum]); count++) - AES_ige_encrypt(buf, buf2, - (size_t)lengths[testnum], &aes_ks3, iv, AES_ENCRYPT); - return count; -} - -static int CRYPTO_gcm128_aad_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - GCM128_CONTEXT *gcm_ctx = tempargs->gcm_ctx; - int count; - for (count = 0; COND(c[D_GHASH][testnum]); count++) - CRYPTO_gcm128_aad(gcm_ctx, buf, lengths[testnum]); - return count; -} - -static int RAND_bytes_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - int count; - - for (count = 0; COND(c[D_RAND][testnum]); count++) - RAND_bytes(buf, lengths[testnum]); - return count; -} - -static long save_count = 0; -static int decrypt = 0; -static int EVP_Update_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EVP_CIPHER_CTX *ctx = tempargs->ctx; - int outl, count, rc; -#ifndef SIGALRM - int nb_iter = save_count * 4 * lengths[0] / lengths[testnum]; -#endif - if (decrypt) { - for (count = 0; COND(nb_iter); count++) { - rc = EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - if (rc != 1) { - /* reset iv in case of counter overflow */ - EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1); - } - } - } else { - for (count = 0; COND(nb_iter); count++) { - rc = EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - if (rc != 1) { - /* reset iv in case of counter overflow */ - EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1); - } - } - } - if (decrypt) - EVP_DecryptFinal_ex(ctx, buf, &outl); - else - EVP_EncryptFinal_ex(ctx, buf, &outl); - return count; -} - -/* - * CCM does not support streaming. For the purpose of performance measurement, - * each message is encrypted using the same (key,iv)-pair. Do not use this - * code in your application. - */ -static int EVP_Update_loop_ccm(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EVP_CIPHER_CTX *ctx = tempargs->ctx; - int outl, count; - unsigned char tag[12]; -#ifndef SIGALRM - int nb_iter = save_count * 4 * lengths[0] / lengths[testnum]; -#endif - if (decrypt) { - for (count = 0; COND(nb_iter); count++) { - EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, sizeof(tag), tag); - /* reset iv */ - EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv); - /* counter is reset on every update */ - EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - } - } else { - for (count = 0; COND(nb_iter); count++) { - /* restore iv length field */ - EVP_EncryptUpdate(ctx, NULL, &outl, NULL, lengths[testnum]); - /* counter is reset on every update */ - EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - } - } - if (decrypt) - EVP_DecryptFinal_ex(ctx, buf, &outl); - else - EVP_EncryptFinal_ex(ctx, buf, &outl); - return count; -} - -/* - * To make AEAD benchmarking more relevant perform TLS-like operations, - * 13-byte AAD followed by payload. But don't use TLS-formatted AAD, as - * payload length is not actually limited by 16KB... - */ -static int EVP_Update_loop_aead(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EVP_CIPHER_CTX *ctx = tempargs->ctx; - int outl, count; - unsigned char aad[13] = { 0xcc }; - unsigned char faketag[16] = { 0xcc }; -#ifndef SIGALRM - int nb_iter = save_count * 4 * lengths[0] / lengths[testnum]; -#endif - if (decrypt) { - for (count = 0; COND(nb_iter); count++) { - EVP_DecryptInit_ex(ctx, NULL, NULL, NULL, iv); - EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, - sizeof(faketag), faketag); - EVP_DecryptUpdate(ctx, NULL, &outl, aad, sizeof(aad)); - EVP_DecryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - EVP_DecryptFinal_ex(ctx, buf + outl, &outl); - } - } else { - for (count = 0; COND(nb_iter); count++) { - EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv); - EVP_EncryptUpdate(ctx, NULL, &outl, aad, sizeof(aad)); - EVP_EncryptUpdate(ctx, buf, &outl, buf, lengths[testnum]); - EVP_EncryptFinal_ex(ctx, buf + outl, &outl); - } - } - return count; -} - -static const EVP_MD *evp_md = NULL; -static int EVP_Digest_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char md[EVP_MAX_MD_SIZE]; - int count; -#ifndef SIGALRM - int nb_iter = save_count * 4 * lengths[0] / lengths[testnum]; -#endif - - for (count = 0; COND(nb_iter); count++) { - if (!EVP_Digest(buf, lengths[testnum], md, NULL, evp_md, NULL)) - return -1; - } - return count; -} - -#ifndef OPENSSL_NO_RSA -static long rsa_c[RSA_NUM][2]; /* # RSA iteration test */ - -static int RSA_sign_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - unsigned int *rsa_num = &tempargs->siglen; - RSA **rsa_key = tempargs->rsa_key; - int ret, count; - for (count = 0; COND(rsa_c[testnum][0]); count++) { - ret = RSA_sign(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]); - if (ret == 0) { - BIO_printf(bio_err, "RSA sign failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} - -static int RSA_verify_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - unsigned int rsa_num = tempargs->siglen; - RSA **rsa_key = tempargs->rsa_key; - int ret, count; - for (count = 0; COND(rsa_c[testnum][1]); count++) { - ret = - RSA_verify(NID_md5_sha1, buf, 36, buf2, rsa_num, rsa_key[testnum]); - if (ret <= 0) { - BIO_printf(bio_err, "RSA verify failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} -#endif - -#ifndef OPENSSL_NO_DSA -static long dsa_c[DSA_NUM][2]; -static int DSA_sign_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - DSA **dsa_key = tempargs->dsa_key; - unsigned int *siglen = &tempargs->siglen; - int ret, count; - for (count = 0; COND(dsa_c[testnum][0]); count++) { - ret = DSA_sign(0, buf, 20, buf2, siglen, dsa_key[testnum]); - if (ret == 0) { - BIO_printf(bio_err, "DSA sign failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} - -static int DSA_verify_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - unsigned char *buf2 = tempargs->buf2; - DSA **dsa_key = tempargs->dsa_key; - unsigned int siglen = tempargs->siglen; - int ret, count; - for (count = 0; COND(dsa_c[testnum][1]); count++) { - ret = DSA_verify(0, buf, 20, buf2, siglen, dsa_key[testnum]); - if (ret <= 0) { - BIO_printf(bio_err, "DSA verify failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} -#endif - -#ifndef OPENSSL_NO_EC -static long ecdsa_c[ECDSA_NUM][2]; -static int ECDSA_sign_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EC_KEY **ecdsa = tempargs->ecdsa; - unsigned char *ecdsasig = tempargs->buf2; - unsigned int *ecdsasiglen = &tempargs->siglen; - int ret, count; - for (count = 0; COND(ecdsa_c[testnum][0]); count++) { - ret = ECDSA_sign(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]); - if (ret == 0) { - BIO_printf(bio_err, "ECDSA sign failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} - -static int ECDSA_verify_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EC_KEY **ecdsa = tempargs->ecdsa; - unsigned char *ecdsasig = tempargs->buf2; - unsigned int ecdsasiglen = tempargs->siglen; - int ret, count; - for (count = 0; COND(ecdsa_c[testnum][1]); count++) { - ret = ECDSA_verify(0, buf, 20, ecdsasig, ecdsasiglen, ecdsa[testnum]); - if (ret != 1) { - BIO_printf(bio_err, "ECDSA verify failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} - -/* ******************************************************************** */ -static long ecdh_c[EC_NUM][1]; - -static int ECDH_EVP_derive_key_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - EVP_PKEY_CTX *ctx = tempargs->ecdh_ctx[testnum]; - unsigned char *derived_secret = tempargs->secret_a; - int count; - size_t *outlen = &(tempargs->outlen[testnum]); - - for (count = 0; COND(ecdh_c[testnum][0]); count++) - EVP_PKEY_derive(ctx, derived_secret, outlen); - - return count; -} - -static long eddsa_c[EdDSA_NUM][2]; -static int EdDSA_sign_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EVP_MD_CTX **edctx = tempargs->eddsa_ctx; - unsigned char *eddsasig = tempargs->buf2; - size_t *eddsasigsize = &tempargs->sigsize; - int ret, count; - - for (count = 0; COND(eddsa_c[testnum][0]); count++) { - ret = EVP_DigestSign(edctx[testnum], eddsasig, eddsasigsize, buf, 20); - if (ret == 0) { - BIO_printf(bio_err, "EdDSA sign failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} - -static int EdDSA_verify_loop(void *args) -{ - loopargs_t *tempargs = *(loopargs_t **) args; - unsigned char *buf = tempargs->buf; - EVP_MD_CTX **edctx = tempargs->eddsa_ctx; - unsigned char *eddsasig = tempargs->buf2; - size_t eddsasigsize = tempargs->sigsize; - int ret, count; - - for (count = 0; COND(eddsa_c[testnum][1]); count++) { - ret = EVP_DigestVerify(edctx[testnum], eddsasig, eddsasigsize, buf, 20); - if (ret != 1) { - BIO_printf(bio_err, "EdDSA verify failure\n"); - ERR_print_errors(bio_err); - count = -1; - break; - } - } - return count; -} -#endif /* OPENSSL_NO_EC */ - -static int run_benchmark(int async_jobs, - int (*loop_function) (void *), loopargs_t * loopargs) -{ - int job_op_count = 0; - int total_op_count = 0; - int num_inprogress = 0; - int error = 0, i = 0, ret = 0; - OSSL_ASYNC_FD job_fd = 0; - size_t num_job_fds = 0; - - if (async_jobs == 0) { - return loop_function((void *)&loopargs); - } - - for (i = 0; i < async_jobs && !error; i++) { - loopargs_t *looparg_item = loopargs + i; - - /* Copy pointer content (looparg_t item address) into async context */ - ret = ASYNC_start_job(&loopargs[i].inprogress_job, loopargs[i].wait_ctx, - &job_op_count, loop_function, - (void *)&looparg_item, sizeof(looparg_item)); - switch (ret) { - case ASYNC_PAUSE: - ++num_inprogress; - break; - case ASYNC_FINISH: - if (job_op_count == -1) { - error = 1; - } else { - total_op_count += job_op_count; - } - break; - case ASYNC_NO_JOBS: - case ASYNC_ERR: - BIO_printf(bio_err, "Failure in the job\n"); - ERR_print_errors(bio_err); - error = 1; - break; - } - } - - while (num_inprogress > 0) { -#if defined(OPENSSL_SYS_WINDOWS) - DWORD avail = 0; -#elif defined(OPENSSL_SYS_UNIX) - int select_result = 0; - OSSL_ASYNC_FD max_fd = 0; - fd_set waitfdset; - - FD_ZERO(&waitfdset); - - for (i = 0; i < async_jobs && num_inprogress > 0; i++) { - if (loopargs[i].inprogress_job == NULL) - continue; - - if (!ASYNC_WAIT_CTX_get_all_fds - (loopargs[i].wait_ctx, NULL, &num_job_fds) - || num_job_fds > 1) { - BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n"); - ERR_print_errors(bio_err); - error = 1; - break; - } - ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, - &num_job_fds); - FD_SET(job_fd, &waitfdset); - if (job_fd > max_fd) - max_fd = job_fd; - } - - if (max_fd >= (OSSL_ASYNC_FD)FD_SETSIZE) { - BIO_printf(bio_err, - "Error: max_fd (%d) must be smaller than FD_SETSIZE (%d). " - "Decrease the value of async_jobs\n", - max_fd, FD_SETSIZE); - ERR_print_errors(bio_err); - error = 1; - break; - } - - select_result = select(max_fd + 1, &waitfdset, NULL, NULL, NULL); - if (select_result == -1 && errno == EINTR) - continue; - - if (select_result == -1) { - BIO_printf(bio_err, "Failure in the select\n"); - ERR_print_errors(bio_err); - error = 1; - break; - } - - if (select_result == 0) - continue; -#endif - - for (i = 0; i < async_jobs; i++) { - if (loopargs[i].inprogress_job == NULL) - continue; - - if (!ASYNC_WAIT_CTX_get_all_fds - (loopargs[i].wait_ctx, NULL, &num_job_fds) - || num_job_fds > 1) { - BIO_printf(bio_err, "Too many fds in ASYNC_WAIT_CTX\n"); - ERR_print_errors(bio_err); - error = 1; - break; - } - ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, - &num_job_fds); - -#if defined(OPENSSL_SYS_UNIX) - if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset)) - continue; -#elif defined(OPENSSL_SYS_WINDOWS) - if (num_job_fds == 1 - && !PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL) - && avail > 0) - continue; -#endif - - ret = ASYNC_start_job(&loopargs[i].inprogress_job, - loopargs[i].wait_ctx, &job_op_count, - loop_function, (void *)(loopargs + i), - sizeof(loopargs_t)); - switch (ret) { - case ASYNC_PAUSE: - break; - case ASYNC_FINISH: - if (job_op_count == -1) { - error = 1; - } else { - total_op_count += job_op_count; - } - --num_inprogress; - loopargs[i].inprogress_job = NULL; - break; - case ASYNC_NO_JOBS: - case ASYNC_ERR: - --num_inprogress; - loopargs[i].inprogress_job = NULL; - BIO_printf(bio_err, "Failure in the job\n"); - ERR_print_errors(bio_err); - error = 1; - break; - } - } - } - - return error ? -1 : total_op_count; -} - -int speed_main(int argc, char **argv) -{ - ENGINE *e = NULL; - loopargs_t *loopargs = NULL; - const char *prog; - const char *engine_id = NULL; - const EVP_CIPHER *evp_cipher = NULL; - double d = 0.0; - OPTION_CHOICE o; - int async_init = 0, multiblock = 0, pr_header = 0; - int doit[ALGOR_NUM] = { 0 }; - int ret = 1, misalign = 0, lengths_single = 0, aead = 0; - long count = 0; - unsigned int size_num = OSSL_NELEM(lengths_list); - unsigned int i, k, loop, loopargs_len = 0, async_jobs = 0; - int keylen; - int buflen; -#ifndef NO_FORK - int multi = 0; -#endif -#if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) \ - || !defined(OPENSSL_NO_EC) - long rsa_count = 1; -#endif - openssl_speed_sec_t seconds = { SECONDS, RSA_SECONDS, DSA_SECONDS, - ECDSA_SECONDS, ECDH_SECONDS, - EdDSA_SECONDS }; - - /* What follows are the buffers and key material. */ -#ifndef OPENSSL_NO_RC5 - RC5_32_KEY rc5_ks; -#endif -#ifndef OPENSSL_NO_RC2 - RC2_KEY rc2_ks; -#endif -#ifndef OPENSSL_NO_IDEA - IDEA_KEY_SCHEDULE idea_ks; -#endif -#ifndef OPENSSL_NO_SEED - SEED_KEY_SCHEDULE seed_ks; -#endif -#ifndef OPENSSL_NO_BF - BF_KEY bf_ks; -#endif -#ifndef OPENSSL_NO_CAST - CAST_KEY cast_ks; -#endif - static const unsigned char key16[16] = { - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, - 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12 - }; - static const unsigned char key24[24] = { - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, - 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, - 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34 - }; - static const unsigned char key32[32] = { - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, - 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, - 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, - 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56 - }; -#ifndef OPENSSL_NO_CAMELLIA - static const unsigned char ckey24[24] = { - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, - 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, - 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34 - }; - static const unsigned char ckey32[32] = { - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, - 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, - 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, - 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56 - }; - CAMELLIA_KEY camellia_ks1, camellia_ks2, camellia_ks3; -#endif -#ifndef OPENSSL_NO_DES - static DES_cblock key = { - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 - }; - static DES_cblock key2 = { - 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12 - }; - static DES_cblock key3 = { - 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34 - }; -#endif -#ifndef OPENSSL_NO_RSA - static const unsigned int rsa_bits[RSA_NUM] = { - 512, 1024, 2048, 3072, 4096, 7680, 15360 - }; - static const unsigned char *rsa_data[RSA_NUM] = { - test512, test1024, test2048, test3072, test4096, test7680, test15360 - }; - static const int rsa_data_length[RSA_NUM] = { - sizeof(test512), sizeof(test1024), - sizeof(test2048), sizeof(test3072), - sizeof(test4096), sizeof(test7680), - sizeof(test15360) - }; - int rsa_doit[RSA_NUM] = { 0 }; - int primes = RSA_DEFAULT_PRIME_NUM; -#endif -#ifndef OPENSSL_NO_DSA - static const unsigned int dsa_bits[DSA_NUM] = { 512, 1024, 2048 }; - int dsa_doit[DSA_NUM] = { 0 }; -#endif -#ifndef OPENSSL_NO_EC - /* - * We only test over the following curves as they are representative, To - * add tests over more curves, simply add the curve NID and curve name to - * the following arrays and increase the |ecdh_choices| list accordingly. - */ - static const struct { - const char *name; - unsigned int nid; - unsigned int bits; - } test_curves[] = { - /* Prime Curves */ - {"secp160r1", NID_secp160r1, 160}, - {"nistp192", NID_X9_62_prime192v1, 192}, - {"nistp224", NID_secp224r1, 224}, - {"nistp256", NID_X9_62_prime256v1, 256}, - {"nistp384", NID_secp384r1, 384}, - {"nistp521", NID_secp521r1, 521}, -# ifndef OPENSSL_NO_EC2M - /* Binary Curves */ - {"nistk163", NID_sect163k1, 163}, - {"nistk233", NID_sect233k1, 233}, - {"nistk283", NID_sect283k1, 283}, - {"nistk409", NID_sect409k1, 409}, - {"nistk571", NID_sect571k1, 571}, - {"nistb163", NID_sect163r2, 163}, - {"nistb233", NID_sect233r1, 233}, - {"nistb283", NID_sect283r1, 283}, - {"nistb409", NID_sect409r1, 409}, - {"nistb571", NID_sect571r1, 571}, -# endif - {"brainpoolP256r1", NID_brainpoolP256r1, 256}, - {"brainpoolP256t1", NID_brainpoolP256t1, 256}, - {"brainpoolP384r1", NID_brainpoolP384r1, 384}, - {"brainpoolP384t1", NID_brainpoolP384t1, 384}, - {"brainpoolP512r1", NID_brainpoolP512r1, 512}, - {"brainpoolP512t1", NID_brainpoolP512t1, 512}, - /* Other and ECDH only ones */ - {"X25519", NID_X25519, 253}, - {"X448", NID_X448, 448} - }; - static const struct { - const char *name; - unsigned int nid; - unsigned int bits; - size_t sigsize; - } test_ed_curves[] = { - /* EdDSA */ - {"Ed25519", NID_ED25519, 253, 64}, - {"Ed448", NID_ED448, 456, 114} - }; - int ecdsa_doit[ECDSA_NUM] = { 0 }; - int ecdh_doit[EC_NUM] = { 0 }; - int eddsa_doit[EdDSA_NUM] = { 0 }; - OPENSSL_assert(OSSL_NELEM(test_curves) >= EC_NUM); - OPENSSL_assert(OSSL_NELEM(test_ed_curves) >= EdDSA_NUM); -#endif /* ndef OPENSSL_NO_EC */ - - prog = opt_init(argc, argv, speed_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opterr: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(speed_options); - ret = 0; - goto end; - case OPT_ELAPSED: - usertime = 0; - break; - case OPT_EVP: - evp_md = NULL; - evp_cipher = EVP_get_cipherbyname(opt_arg()); - if (evp_cipher == NULL) - evp_md = EVP_get_digestbyname(opt_arg()); - if (evp_cipher == NULL && evp_md == NULL) { - BIO_printf(bio_err, - "%s: %s is an unknown cipher or digest\n", - prog, opt_arg()); - goto end; - } - doit[D_EVP] = 1; - break; - case OPT_DECRYPT: - decrypt = 1; - break; - case OPT_ENGINE: - /* - * In a forked execution, an engine might need to be - * initialised by each child process, not by the parent. - * So store the name here and run setup_engine() later on. - */ - engine_id = opt_arg(); - break; - case OPT_MULTI: -#ifndef NO_FORK - multi = atoi(opt_arg()); -#endif - break; - case OPT_ASYNCJOBS: -#ifndef OPENSSL_NO_ASYNC - async_jobs = atoi(opt_arg()); - if (!ASYNC_is_capable()) { - BIO_printf(bio_err, - "%s: async_jobs specified but async not supported\n", - prog); - goto opterr; - } - if (async_jobs > 99999) { - BIO_printf(bio_err, "%s: too many async_jobs\n", prog); - goto opterr; - } -#endif - break; - case OPT_MISALIGN: - if (!opt_int(opt_arg(), &misalign)) - goto end; - if (misalign > MISALIGN) { - BIO_printf(bio_err, - "%s: Maximum offset is %d\n", prog, MISALIGN); - goto opterr; - } - break; - case OPT_MR: - mr = 1; - break; - case OPT_MB: - multiblock = 1; -#ifdef OPENSSL_NO_MULTIBLOCK - BIO_printf(bio_err, - "%s: -mb specified but multi-block support is disabled\n", - prog); - goto end; -#endif - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_PRIMES: - if (!opt_int(opt_arg(), &primes)) - goto end; - break; - case OPT_SECONDS: - seconds.sym = seconds.rsa = seconds.dsa = seconds.ecdsa - = seconds.ecdh = seconds.eddsa = atoi(opt_arg()); - break; - case OPT_BYTES: - lengths_single = atoi(opt_arg()); - lengths = &lengths_single; - size_num = 1; - break; - case OPT_AEAD: - aead = 1; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - /* Remaining arguments are algorithms. */ - for (; *argv; argv++) { - if (found(*argv, doit_choices, &i)) { - doit[i] = 1; - continue; - } -#ifndef OPENSSL_NO_DES - if (strcmp(*argv, "des") == 0) { - doit[D_CBC_DES] = doit[D_EDE3_DES] = 1; - continue; - } -#endif - if (strcmp(*argv, "sha") == 0) { - doit[D_SHA1] = doit[D_SHA256] = doit[D_SHA512] = 1; - continue; - } -#ifndef OPENSSL_NO_RSA - if (strcmp(*argv, "openssl") == 0) - continue; - if (strcmp(*argv, "rsa") == 0) { - for (loop = 0; loop < OSSL_NELEM(rsa_doit); loop++) - rsa_doit[loop] = 1; - continue; - } - if (found(*argv, rsa_choices, &i)) { - rsa_doit[i] = 1; - continue; - } -#endif -#ifndef OPENSSL_NO_DSA - if (strcmp(*argv, "dsa") == 0) { - dsa_doit[R_DSA_512] = dsa_doit[R_DSA_1024] = - dsa_doit[R_DSA_2048] = 1; - continue; - } - if (found(*argv, dsa_choices, &i)) { - dsa_doit[i] = 2; - continue; - } -#endif - if (strcmp(*argv, "aes") == 0) { - doit[D_CBC_128_AES] = doit[D_CBC_192_AES] = doit[D_CBC_256_AES] = 1; - continue; - } -#ifndef OPENSSL_NO_CAMELLIA - if (strcmp(*argv, "camellia") == 0) { - doit[D_CBC_128_CML] = doit[D_CBC_192_CML] = doit[D_CBC_256_CML] = 1; - continue; - } -#endif -#ifndef OPENSSL_NO_EC - if (strcmp(*argv, "ecdsa") == 0) { - for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++) - ecdsa_doit[loop] = 1; - continue; - } - if (found(*argv, ecdsa_choices, &i)) { - ecdsa_doit[i] = 2; - continue; - } - if (strcmp(*argv, "ecdh") == 0) { - for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++) - ecdh_doit[loop] = 1; - continue; - } - if (found(*argv, ecdh_choices, &i)) { - ecdh_doit[i] = 2; - continue; - } - if (strcmp(*argv, "eddsa") == 0) { - for (loop = 0; loop < OSSL_NELEM(eddsa_doit); loop++) - eddsa_doit[loop] = 1; - continue; - } - if (found(*argv, eddsa_choices, &i)) { - eddsa_doit[i] = 2; - continue; - } -#endif - BIO_printf(bio_err, "%s: Unknown algorithm %s\n", prog, *argv); - goto end; - } - - /* Sanity checks */ - if (aead) { - if (evp_cipher == NULL) { - BIO_printf(bio_err, "-aead can be used only with an AEAD cipher\n"); - goto end; - } else if (!(EVP_CIPHER_flags(evp_cipher) & - EVP_CIPH_FLAG_AEAD_CIPHER)) { - BIO_printf(bio_err, "%s is not an AEAD cipher\n", - OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher))); - goto end; - } - } - if (multiblock) { - if (evp_cipher == NULL) { - BIO_printf(bio_err,"-mb can be used only with a multi-block" - " capable cipher\n"); - goto end; - } else if (!(EVP_CIPHER_flags(evp_cipher) & - EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) { - BIO_printf(bio_err, "%s is not a multi-block capable\n", - OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher))); - goto end; - } else if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with -mb"); - goto end; - } - } - - /* Initialize the job pool if async mode is enabled */ - if (async_jobs > 0) { - async_init = ASYNC_init_thread(async_jobs, async_jobs); - if (!async_init) { - BIO_printf(bio_err, "Error creating the ASYNC job pool\n"); - goto end; - } - } - - loopargs_len = (async_jobs == 0 ? 1 : async_jobs); - loopargs = - app_malloc(loopargs_len * sizeof(loopargs_t), "array of loopargs"); - memset(loopargs, 0, loopargs_len * sizeof(loopargs_t)); - - for (i = 0; i < loopargs_len; i++) { - if (async_jobs > 0) { - loopargs[i].wait_ctx = ASYNC_WAIT_CTX_new(); - if (loopargs[i].wait_ctx == NULL) { - BIO_printf(bio_err, "Error creating the ASYNC_WAIT_CTX\n"); - goto end; - } - } - - buflen = lengths[size_num - 1]; - if (buflen < 36) /* size of random vector in RSA benchmark */ - buflen = 36; - buflen += MAX_MISALIGNMENT + 1; - loopargs[i].buf_malloc = app_malloc(buflen, "input buffer"); - loopargs[i].buf2_malloc = app_malloc(buflen, "input buffer"); - memset(loopargs[i].buf_malloc, 0, buflen); - memset(loopargs[i].buf2_malloc, 0, buflen); - - /* Align the start of buffers on a 64 byte boundary */ - loopargs[i].buf = loopargs[i].buf_malloc + misalign; - loopargs[i].buf2 = loopargs[i].buf2_malloc + misalign; -#ifndef OPENSSL_NO_EC - loopargs[i].secret_a = app_malloc(MAX_ECDH_SIZE, "ECDH secret a"); - loopargs[i].secret_b = app_malloc(MAX_ECDH_SIZE, "ECDH secret b"); -#endif - } - -#ifndef NO_FORK - if (multi && do_multi(multi, size_num)) - goto show_res; -#endif - - /* Initialize the engine after the fork */ - e = setup_engine(engine_id, 0); - - /* No parameters; turn on everything. */ - if ((argc == 0) && !doit[D_EVP]) { - for (i = 0; i < ALGOR_NUM; i++) - if (i != D_EVP) - doit[i] = 1; -#ifndef OPENSSL_NO_RSA - for (i = 0; i < RSA_NUM; i++) - rsa_doit[i] = 1; -#endif -#ifndef OPENSSL_NO_DSA - for (i = 0; i < DSA_NUM; i++) - dsa_doit[i] = 1; -#endif -#ifndef OPENSSL_NO_EC - for (loop = 0; loop < OSSL_NELEM(ecdsa_doit); loop++) - ecdsa_doit[loop] = 1; - for (loop = 0; loop < OSSL_NELEM(ecdh_doit); loop++) - ecdh_doit[loop] = 1; - for (loop = 0; loop < OSSL_NELEM(eddsa_doit); loop++) - eddsa_doit[loop] = 1; -#endif - } - for (i = 0; i < ALGOR_NUM; i++) - if (doit[i]) - pr_header++; - - if (usertime == 0 && !mr) - BIO_printf(bio_err, - "You have chosen to measure elapsed time " - "instead of user CPU time.\n"); - -#ifndef OPENSSL_NO_RSA - for (i = 0; i < loopargs_len; i++) { - if (primes > RSA_DEFAULT_PRIME_NUM) { - /* for multi-prime RSA, skip this */ - break; - } - for (k = 0; k < RSA_NUM; k++) { - const unsigned char *p; - - p = rsa_data[k]; - loopargs[i].rsa_key[k] = - d2i_RSAPrivateKey(NULL, &p, rsa_data_length[k]); - if (loopargs[i].rsa_key[k] == NULL) { - BIO_printf(bio_err, - "internal error loading RSA key number %d\n", k); - goto end; - } - } - } -#endif -#ifndef OPENSSL_NO_DSA - for (i = 0; i < loopargs_len; i++) { - loopargs[i].dsa_key[0] = get_dsa(512); - loopargs[i].dsa_key[1] = get_dsa(1024); - loopargs[i].dsa_key[2] = get_dsa(2048); - } -#endif -#ifndef OPENSSL_NO_DES - DES_set_key_unchecked(&key, &sch); - DES_set_key_unchecked(&key2, &sch2); - DES_set_key_unchecked(&key3, &sch3); -#endif - AES_set_encrypt_key(key16, 128, &aes_ks1); - AES_set_encrypt_key(key24, 192, &aes_ks2); - AES_set_encrypt_key(key32, 256, &aes_ks3); -#ifndef OPENSSL_NO_CAMELLIA - Camellia_set_key(key16, 128, &camellia_ks1); - Camellia_set_key(ckey24, 192, &camellia_ks2); - Camellia_set_key(ckey32, 256, &camellia_ks3); -#endif -#ifndef OPENSSL_NO_IDEA - IDEA_set_encrypt_key(key16, &idea_ks); -#endif -#ifndef OPENSSL_NO_SEED - SEED_set_key(key16, &seed_ks); -#endif -#ifndef OPENSSL_NO_RC4 - RC4_set_key(&rc4_ks, 16, key16); -#endif -#ifndef OPENSSL_NO_RC2 - RC2_set_key(&rc2_ks, 16, key16, 128); -#endif -#ifndef OPENSSL_NO_RC5 - RC5_32_set_key(&rc5_ks, 16, key16, 12); -#endif -#ifndef OPENSSL_NO_BF - BF_set_key(&bf_ks, 16, key16); -#endif -#ifndef OPENSSL_NO_CAST - CAST_set_key(&cast_ks, 16, key16); -#endif -#ifndef SIGALRM -# ifndef OPENSSL_NO_DES - BIO_printf(bio_err, "First we calculate the approximate speed ...\n"); - count = 10; - do { - long it; - count *= 2; - Time_F(START); - for (it = count; it; it--) - DES_ecb_encrypt((DES_cblock *)loopargs[0].buf, - (DES_cblock *)loopargs[0].buf, &sch, DES_ENCRYPT); - d = Time_F(STOP); - } while (d < 3); - save_count = count; - c[D_MD2][0] = count / 10; - c[D_MDC2][0] = count / 10; - c[D_MD4][0] = count; - c[D_MD5][0] = count; - c[D_HMAC][0] = count; - c[D_SHA1][0] = count; - c[D_RMD160][0] = count; - c[D_RC4][0] = count * 5; - c[D_CBC_DES][0] = count; - c[D_EDE3_DES][0] = count / 3; - c[D_CBC_IDEA][0] = count; - c[D_CBC_SEED][0] = count; - c[D_CBC_RC2][0] = count; - c[D_CBC_RC5][0] = count; - c[D_CBC_BF][0] = count; - c[D_CBC_CAST][0] = count; - c[D_CBC_128_AES][0] = count; - c[D_CBC_192_AES][0] = count; - c[D_CBC_256_AES][0] = count; - c[D_CBC_128_CML][0] = count; - c[D_CBC_192_CML][0] = count; - c[D_CBC_256_CML][0] = count; - c[D_SHA256][0] = count; - c[D_SHA512][0] = count; - c[D_WHIRLPOOL][0] = count; - c[D_IGE_128_AES][0] = count; - c[D_IGE_192_AES][0] = count; - c[D_IGE_256_AES][0] = count; - c[D_GHASH][0] = count; - c[D_RAND][0] = count; - - for (i = 1; i < size_num; i++) { - long l0, l1; - - l0 = (long)lengths[0]; - l1 = (long)lengths[i]; - - c[D_MD2][i] = c[D_MD2][0] * 4 * l0 / l1; - c[D_MDC2][i] = c[D_MDC2][0] * 4 * l0 / l1; - c[D_MD4][i] = c[D_MD4][0] * 4 * l0 / l1; - c[D_MD5][i] = c[D_MD5][0] * 4 * l0 / l1; - c[D_HMAC][i] = c[D_HMAC][0] * 4 * l0 / l1; - c[D_SHA1][i] = c[D_SHA1][0] * 4 * l0 / l1; - c[D_RMD160][i] = c[D_RMD160][0] * 4 * l0 / l1; - c[D_SHA256][i] = c[D_SHA256][0] * 4 * l0 / l1; - c[D_SHA512][i] = c[D_SHA512][0] * 4 * l0 / l1; - c[D_WHIRLPOOL][i] = c[D_WHIRLPOOL][0] * 4 * l0 / l1; - c[D_GHASH][i] = c[D_GHASH][0] * 4 * l0 / l1; - c[D_RAND][i] = c[D_RAND][0] * 4 * l0 / l1; - - l0 = (long)lengths[i - 1]; - - c[D_RC4][i] = c[D_RC4][i - 1] * l0 / l1; - c[D_CBC_DES][i] = c[D_CBC_DES][i - 1] * l0 / l1; - c[D_EDE3_DES][i] = c[D_EDE3_DES][i - 1] * l0 / l1; - c[D_CBC_IDEA][i] = c[D_CBC_IDEA][i - 1] * l0 / l1; - c[D_CBC_SEED][i] = c[D_CBC_SEED][i - 1] * l0 / l1; - c[D_CBC_RC2][i] = c[D_CBC_RC2][i - 1] * l0 / l1; - c[D_CBC_RC5][i] = c[D_CBC_RC5][i - 1] * l0 / l1; - c[D_CBC_BF][i] = c[D_CBC_BF][i - 1] * l0 / l1; - c[D_CBC_CAST][i] = c[D_CBC_CAST][i - 1] * l0 / l1; - c[D_CBC_128_AES][i] = c[D_CBC_128_AES][i - 1] * l0 / l1; - c[D_CBC_192_AES][i] = c[D_CBC_192_AES][i - 1] * l0 / l1; - c[D_CBC_256_AES][i] = c[D_CBC_256_AES][i - 1] * l0 / l1; - c[D_CBC_128_CML][i] = c[D_CBC_128_CML][i - 1] * l0 / l1; - c[D_CBC_192_CML][i] = c[D_CBC_192_CML][i - 1] * l0 / l1; - c[D_CBC_256_CML][i] = c[D_CBC_256_CML][i - 1] * l0 / l1; - c[D_IGE_128_AES][i] = c[D_IGE_128_AES][i - 1] * l0 / l1; - c[D_IGE_192_AES][i] = c[D_IGE_192_AES][i - 1] * l0 / l1; - c[D_IGE_256_AES][i] = c[D_IGE_256_AES][i - 1] * l0 / l1; - } - -# ifndef OPENSSL_NO_RSA - rsa_c[R_RSA_512][0] = count / 2000; - rsa_c[R_RSA_512][1] = count / 400; - for (i = 1; i < RSA_NUM; i++) { - rsa_c[i][0] = rsa_c[i - 1][0] / 8; - rsa_c[i][1] = rsa_c[i - 1][1] / 4; - if (rsa_doit[i] <= 1 && rsa_c[i][0] == 0) - rsa_doit[i] = 0; - else { - if (rsa_c[i][0] == 0) { - rsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */ - rsa_c[i][1] = 20; - } - } - } -# endif - -# ifndef OPENSSL_NO_DSA - dsa_c[R_DSA_512][0] = count / 1000; - dsa_c[R_DSA_512][1] = count / 1000 / 2; - for (i = 1; i < DSA_NUM; i++) { - dsa_c[i][0] = dsa_c[i - 1][0] / 4; - dsa_c[i][1] = dsa_c[i - 1][1] / 4; - if (dsa_doit[i] <= 1 && dsa_c[i][0] == 0) - dsa_doit[i] = 0; - else { - if (dsa_c[i][0] == 0) { - dsa_c[i][0] = 1; /* Set minimum iteration Nb to 1. */ - dsa_c[i][1] = 1; - } - } - } -# endif - -# ifndef OPENSSL_NO_EC - ecdsa_c[R_EC_P160][0] = count / 1000; - ecdsa_c[R_EC_P160][1] = count / 1000 / 2; - for (i = R_EC_P192; i <= R_EC_P521; i++) { - ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2; - ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2; - if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0) - ecdsa_doit[i] = 0; - else { - if (ecdsa_c[i][0] == 0) { - ecdsa_c[i][0] = 1; - ecdsa_c[i][1] = 1; - } - } - } -# ifndef OPENSSL_NO_EC2M - ecdsa_c[R_EC_K163][0] = count / 1000; - ecdsa_c[R_EC_K163][1] = count / 1000 / 2; - for (i = R_EC_K233; i <= R_EC_K571; i++) { - ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2; - ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2; - if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0) - ecdsa_doit[i] = 0; - else { - if (ecdsa_c[i][0] == 0) { - ecdsa_c[i][0] = 1; - ecdsa_c[i][1] = 1; - } - } - } - ecdsa_c[R_EC_B163][0] = count / 1000; - ecdsa_c[R_EC_B163][1] = count / 1000 / 2; - for (i = R_EC_B233; i <= R_EC_B571; i++) { - ecdsa_c[i][0] = ecdsa_c[i - 1][0] / 2; - ecdsa_c[i][1] = ecdsa_c[i - 1][1] / 2; - if (ecdsa_doit[i] <= 1 && ecdsa_c[i][0] == 0) - ecdsa_doit[i] = 0; - else { - if (ecdsa_c[i][0] == 0) { - ecdsa_c[i][0] = 1; - ecdsa_c[i][1] = 1; - } - } - } -# endif - - ecdh_c[R_EC_P160][0] = count / 1000; - for (i = R_EC_P192; i <= R_EC_P521; i++) { - ecdh_c[i][0] = ecdh_c[i - 1][0] / 2; - if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0) - ecdh_doit[i] = 0; - else { - if (ecdh_c[i][0] == 0) { - ecdh_c[i][0] = 1; - } - } - } -# ifndef OPENSSL_NO_EC2M - ecdh_c[R_EC_K163][0] = count / 1000; - for (i = R_EC_K233; i <= R_EC_K571; i++) { - ecdh_c[i][0] = ecdh_c[i - 1][0] / 2; - if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0) - ecdh_doit[i] = 0; - else { - if (ecdh_c[i][0] == 0) { - ecdh_c[i][0] = 1; - } - } - } - ecdh_c[R_EC_B163][0] = count / 1000; - for (i = R_EC_B233; i <= R_EC_B571; i++) { - ecdh_c[i][0] = ecdh_c[i - 1][0] / 2; - if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0) - ecdh_doit[i] = 0; - else { - if (ecdh_c[i][0] == 0) { - ecdh_c[i][0] = 1; - } - } - } -# endif - /* repeated code good to factorize */ - ecdh_c[R_EC_BRP256R1][0] = count / 1000; - for (i = R_EC_BRP384R1; i <= R_EC_BRP512R1; i += 2) { - ecdh_c[i][0] = ecdh_c[i - 2][0] / 2; - if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0) - ecdh_doit[i] = 0; - else { - if (ecdh_c[i][0] == 0) { - ecdh_c[i][0] = 1; - } - } - } - ecdh_c[R_EC_BRP256T1][0] = count / 1000; - for (i = R_EC_BRP384T1; i <= R_EC_BRP512T1; i += 2) { - ecdh_c[i][0] = ecdh_c[i - 2][0] / 2; - if (ecdh_doit[i] <= 1 && ecdh_c[i][0] == 0) - ecdh_doit[i] = 0; - else { - if (ecdh_c[i][0] == 0) { - ecdh_c[i][0] = 1; - } - } - } - /* default iteration count for the last two EC Curves */ - ecdh_c[R_EC_X25519][0] = count / 1800; - ecdh_c[R_EC_X448][0] = count / 7200; - - eddsa_c[R_EC_Ed25519][0] = count / 1800; - eddsa_c[R_EC_Ed448][0] = count / 7200; -# endif - -# else -/* not worth fixing */ -# error "You cannot disable DES on systems without SIGALRM." -# endif /* OPENSSL_NO_DES */ -#elif SIGALRM > 0 - signal(SIGALRM, alarmed); -#endif /* SIGALRM */ - -#ifndef OPENSSL_NO_MD2 - if (doit[D_MD2]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_MD2], c[D_MD2][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, EVP_Digest_MD2_loop, loopargs); - d = Time_F(STOP); - print_result(D_MD2, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_MDC2 - if (doit[D_MDC2]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_MDC2], c[D_MDC2][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, EVP_Digest_MDC2_loop, loopargs); - d = Time_F(STOP); - print_result(D_MDC2, testnum, count, d); - } - } -#endif - -#ifndef OPENSSL_NO_MD4 - if (doit[D_MD4]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_MD4], c[D_MD4][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, EVP_Digest_MD4_loop, loopargs); - d = Time_F(STOP); - print_result(D_MD4, testnum, count, d); - } - } -#endif - -#ifndef OPENSSL_NO_MD5 - if (doit[D_MD5]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_MD5], c[D_MD5][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, MD5_loop, loopargs); - d = Time_F(STOP); - print_result(D_MD5, testnum, count, d); - } - } - - if (doit[D_HMAC]) { - static const char hmac_key[] = "This is a key..."; - int len = strlen(hmac_key); - - for (i = 0; i < loopargs_len; i++) { - loopargs[i].hctx = HMAC_CTX_new(); - if (loopargs[i].hctx == NULL) { - BIO_printf(bio_err, "HMAC malloc failure, exiting..."); - exit(1); - } - - HMAC_Init_ex(loopargs[i].hctx, hmac_key, len, EVP_md5(), NULL); - } - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_HMAC], c[D_HMAC][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, HMAC_loop, loopargs); - d = Time_F(STOP); - print_result(D_HMAC, testnum, count, d); - } - for (i = 0; i < loopargs_len; i++) { - HMAC_CTX_free(loopargs[i].hctx); - } - } -#endif - if (doit[D_SHA1]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_SHA1], c[D_SHA1][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, SHA1_loop, loopargs); - d = Time_F(STOP); - print_result(D_SHA1, testnum, count, d); - } - } - if (doit[D_SHA256]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_SHA256], c[D_SHA256][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, SHA256_loop, loopargs); - d = Time_F(STOP); - print_result(D_SHA256, testnum, count, d); - } - } - if (doit[D_SHA512]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_SHA512], c[D_SHA512][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, SHA512_loop, loopargs); - d = Time_F(STOP); - print_result(D_SHA512, testnum, count, d); - } - } -#ifndef OPENSSL_NO_WHIRLPOOL - if (doit[D_WHIRLPOOL]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_WHIRLPOOL], c[D_WHIRLPOOL][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, WHIRLPOOL_loop, loopargs); - d = Time_F(STOP); - print_result(D_WHIRLPOOL, testnum, count, d); - } - } -#endif - -#ifndef OPENSSL_NO_RMD160 - if (doit[D_RMD160]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_RMD160], c[D_RMD160][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, EVP_Digest_RMD160_loop, loopargs); - d = Time_F(STOP); - print_result(D_RMD160, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_RC4 - if (doit[D_RC4]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_RC4], c[D_RC4][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, RC4_loop, loopargs); - d = Time_F(STOP); - print_result(D_RC4, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_DES - if (doit[D_CBC_DES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_CBC_DES], c[D_CBC_DES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, DES_ncbc_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_CBC_DES, testnum, count, d); - } - } - - if (doit[D_EDE3_DES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_EDE3_DES], c[D_EDE3_DES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, DES_ede3_cbc_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_EDE3_DES, testnum, count, d); - } - } -#endif - - if (doit[D_CBC_128_AES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_CBC_128_AES], c[D_CBC_128_AES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, AES_cbc_128_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_CBC_128_AES, testnum, count, d); - } - } - if (doit[D_CBC_192_AES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_CBC_192_AES], c[D_CBC_192_AES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, AES_cbc_192_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_CBC_192_AES, testnum, count, d); - } - } - if (doit[D_CBC_256_AES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_CBC_256_AES], c[D_CBC_256_AES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, AES_cbc_256_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_CBC_256_AES, testnum, count, d); - } - } - - if (doit[D_IGE_128_AES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_IGE_128_AES], c[D_IGE_128_AES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, AES_ige_128_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_IGE_128_AES, testnum, count, d); - } - } - if (doit[D_IGE_192_AES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_IGE_192_AES], c[D_IGE_192_AES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, AES_ige_192_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_IGE_192_AES, testnum, count, d); - } - } - if (doit[D_IGE_256_AES]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_IGE_256_AES], c[D_IGE_256_AES][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = - run_benchmark(async_jobs, AES_ige_256_encrypt_loop, loopargs); - d = Time_F(STOP); - print_result(D_IGE_256_AES, testnum, count, d); - } - } - if (doit[D_GHASH]) { - for (i = 0; i < loopargs_len; i++) { - loopargs[i].gcm_ctx = - CRYPTO_gcm128_new(&aes_ks1, (block128_f) AES_encrypt); - CRYPTO_gcm128_setiv(loopargs[i].gcm_ctx, - (unsigned char *)"0123456789ab", 12); - } - - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_GHASH], c[D_GHASH][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, CRYPTO_gcm128_aad_loop, loopargs); - d = Time_F(STOP); - print_result(D_GHASH, testnum, count, d); - } - for (i = 0; i < loopargs_len; i++) - CRYPTO_gcm128_release(loopargs[i].gcm_ctx); - } -#ifndef OPENSSL_NO_CAMELLIA - if (doit[D_CBC_128_CML]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_128_CML]); - doit[D_CBC_128_CML] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_128_CML], c[D_CBC_128_CML][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - for (count = 0; COND(c[D_CBC_128_CML][testnum]); count++) - Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &camellia_ks1, - iv, CAMELLIA_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_128_CML, testnum, count, d); - } - } - if (doit[D_CBC_192_CML]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_192_CML]); - doit[D_CBC_192_CML] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_192_CML], c[D_CBC_192_CML][testnum], - lengths[testnum], seconds.sym); - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported, exiting..."); - exit(1); - } - Time_F(START); - for (count = 0; COND(c[D_CBC_192_CML][testnum]); count++) - Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &camellia_ks2, - iv, CAMELLIA_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_192_CML, testnum, count, d); - } - } - if (doit[D_CBC_256_CML]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_256_CML]); - doit[D_CBC_256_CML] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_256_CML], c[D_CBC_256_CML][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - for (count = 0; COND(c[D_CBC_256_CML][testnum]); count++) - Camellia_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &camellia_ks3, - iv, CAMELLIA_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_256_CML, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_IDEA - if (doit[D_CBC_IDEA]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_IDEA]); - doit[D_CBC_IDEA] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_IDEA], c[D_CBC_IDEA][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - for (count = 0; COND(c[D_CBC_IDEA][testnum]); count++) - IDEA_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &idea_ks, - iv, IDEA_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_IDEA, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_SEED - if (doit[D_CBC_SEED]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_SEED]); - doit[D_CBC_SEED] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_SEED], c[D_CBC_SEED][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - for (count = 0; COND(c[D_CBC_SEED][testnum]); count++) - SEED_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &seed_ks, iv, 1); - d = Time_F(STOP); - print_result(D_CBC_SEED, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_RC2 - if (doit[D_CBC_RC2]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_RC2]); - doit[D_CBC_RC2] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_RC2], c[D_CBC_RC2][testnum], - lengths[testnum], seconds.sym); - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported, exiting..."); - exit(1); - } - Time_F(START); - for (count = 0; COND(c[D_CBC_RC2][testnum]); count++) - RC2_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &rc2_ks, - iv, RC2_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_RC2, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_RC5 - if (doit[D_CBC_RC5]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_RC5]); - doit[D_CBC_RC5] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_RC5], c[D_CBC_RC5][testnum], - lengths[testnum], seconds.sym); - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported, exiting..."); - exit(1); - } - Time_F(START); - for (count = 0; COND(c[D_CBC_RC5][testnum]); count++) - RC5_32_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &rc5_ks, - iv, RC5_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_RC5, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_BF - if (doit[D_CBC_BF]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_BF]); - doit[D_CBC_BF] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_BF], c[D_CBC_BF][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - for (count = 0; COND(c[D_CBC_BF][testnum]); count++) - BF_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &bf_ks, - iv, BF_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_BF, testnum, count, d); - } - } -#endif -#ifndef OPENSSL_NO_CAST - if (doit[D_CBC_CAST]) { - if (async_jobs > 0) { - BIO_printf(bio_err, "Async mode is not supported with %s\n", - names[D_CBC_CAST]); - doit[D_CBC_CAST] = 0; - } - for (testnum = 0; testnum < size_num && async_init == 0; testnum++) { - print_message(names[D_CBC_CAST], c[D_CBC_CAST][testnum], - lengths[testnum], seconds.sym); - Time_F(START); - for (count = 0; COND(c[D_CBC_CAST][testnum]); count++) - CAST_cbc_encrypt(loopargs[0].buf, loopargs[0].buf, - (size_t)lengths[testnum], &cast_ks, - iv, CAST_ENCRYPT); - d = Time_F(STOP); - print_result(D_CBC_CAST, testnum, count, d); - } - } -#endif - if (doit[D_RAND]) { - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_RAND], c[D_RAND][testnum], lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, RAND_bytes_loop, loopargs); - d = Time_F(STOP); - print_result(D_RAND, testnum, count, d); - } - } - - if (doit[D_EVP]) { - if (evp_cipher != NULL) { - int (*loopfunc)(void *args) = EVP_Update_loop; - - if (multiblock && (EVP_CIPHER_flags(evp_cipher) & - EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) { - multiblock_speed(evp_cipher, lengths_single, &seconds); - ret = 0; - goto end; - } - - names[D_EVP] = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)); - - if (EVP_CIPHER_mode(evp_cipher) == EVP_CIPH_CCM_MODE) { - loopfunc = EVP_Update_loop_ccm; - } else if (aead && (EVP_CIPHER_flags(evp_cipher) & - EVP_CIPH_FLAG_AEAD_CIPHER)) { - loopfunc = EVP_Update_loop_aead; - if (lengths == lengths_list) { - lengths = aead_lengths_list; - size_num = OSSL_NELEM(aead_lengths_list); - } - } - - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_EVP], save_count, lengths[testnum], - seconds.sym); - - for (k = 0; k < loopargs_len; k++) { - loopargs[k].ctx = EVP_CIPHER_CTX_new(); - if (loopargs[k].ctx == NULL) { - BIO_printf(bio_err, "\nEVP_CIPHER_CTX_new failure\n"); - exit(1); - } - if (!EVP_CipherInit_ex(loopargs[k].ctx, evp_cipher, NULL, - NULL, iv, decrypt ? 0 : 1)) { - BIO_printf(bio_err, "\nEVP_CipherInit_ex failure\n"); - ERR_print_errors(bio_err); - exit(1); - } - - EVP_CIPHER_CTX_set_padding(loopargs[k].ctx, 0); - - keylen = EVP_CIPHER_CTX_key_length(loopargs[k].ctx); - loopargs[k].key = app_malloc(keylen, "evp_cipher key"); - EVP_CIPHER_CTX_rand_key(loopargs[k].ctx, loopargs[k].key); - if (!EVP_CipherInit_ex(loopargs[k].ctx, NULL, NULL, - loopargs[k].key, NULL, -1)) { - BIO_printf(bio_err, "\nEVP_CipherInit_ex failure\n"); - ERR_print_errors(bio_err); - exit(1); - } - OPENSSL_clear_free(loopargs[k].key, keylen); - } - - Time_F(START); - count = run_benchmark(async_jobs, loopfunc, loopargs); - d = Time_F(STOP); - for (k = 0; k < loopargs_len; k++) { - EVP_CIPHER_CTX_free(loopargs[k].ctx); - } - print_result(D_EVP, testnum, count, d); - } - } else if (evp_md != NULL) { - names[D_EVP] = OBJ_nid2ln(EVP_MD_type(evp_md)); - - for (testnum = 0; testnum < size_num; testnum++) { - print_message(names[D_EVP], save_count, lengths[testnum], - seconds.sym); - Time_F(START); - count = run_benchmark(async_jobs, EVP_Digest_loop, loopargs); - d = Time_F(STOP); - print_result(D_EVP, testnum, count, d); - } - } - } - - for (i = 0; i < loopargs_len; i++) - if (RAND_bytes(loopargs[i].buf, 36) <= 0) - goto end; - -#ifndef OPENSSL_NO_RSA - for (testnum = 0; testnum < RSA_NUM; testnum++) { - int st = 0; - if (!rsa_doit[testnum]) - continue; - for (i = 0; i < loopargs_len; i++) { - if (primes > 2) { - /* we haven't set keys yet, generate multi-prime RSA keys */ - BIGNUM *bn = BN_new(); - - if (bn == NULL) - goto end; - if (!BN_set_word(bn, RSA_F4)) { - BN_free(bn); - goto end; - } - - BIO_printf(bio_err, "Generate multi-prime RSA key for %s\n", - rsa_choices[testnum].name); - - loopargs[i].rsa_key[testnum] = RSA_new(); - if (loopargs[i].rsa_key[testnum] == NULL) { - BN_free(bn); - goto end; - } - - if (!RSA_generate_multi_prime_key(loopargs[i].rsa_key[testnum], - rsa_bits[testnum], - primes, bn, NULL)) { - BN_free(bn); - goto end; - } - BN_free(bn); - } - st = RSA_sign(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2, - &loopargs[i].siglen, loopargs[i].rsa_key[testnum]); - if (st == 0) - break; - } - if (st == 0) { - BIO_printf(bio_err, - "RSA sign failure. No RSA sign will be done.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - } else { - pkey_print_message("private", "rsa", - rsa_c[testnum][0], rsa_bits[testnum], - seconds.rsa); - /* RSA_blinding_on(rsa_key[testnum],NULL); */ - Time_F(START); - count = run_benchmark(async_jobs, RSA_sign_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R1:%ld:%d:%.2f\n" - : "%ld %u bits private RSA's in %.2fs\n", - count, rsa_bits[testnum], d); - rsa_results[testnum][0] = (double)count / d; - rsa_count = count; - } - - for (i = 0; i < loopargs_len; i++) { - st = RSA_verify(NID_md5_sha1, loopargs[i].buf, 36, loopargs[i].buf2, - loopargs[i].siglen, loopargs[i].rsa_key[testnum]); - if (st <= 0) - break; - } - if (st <= 0) { - BIO_printf(bio_err, - "RSA verify failure. No RSA verify will be done.\n"); - ERR_print_errors(bio_err); - rsa_doit[testnum] = 0; - } else { - pkey_print_message("public", "rsa", - rsa_c[testnum][1], rsa_bits[testnum], - seconds.rsa); - Time_F(START); - count = run_benchmark(async_jobs, RSA_verify_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R2:%ld:%d:%.2f\n" - : "%ld %u bits public RSA's in %.2fs\n", - count, rsa_bits[testnum], d); - rsa_results[testnum][1] = (double)count / d; - } - - if (rsa_count <= 1) { - /* if longer than 10s, don't do any more */ - for (testnum++; testnum < RSA_NUM; testnum++) - rsa_doit[testnum] = 0; - } - } -#endif /* OPENSSL_NO_RSA */ - - for (i = 0; i < loopargs_len; i++) - if (RAND_bytes(loopargs[i].buf, 36) <= 0) - goto end; - -#ifndef OPENSSL_NO_DSA - for (testnum = 0; testnum < DSA_NUM; testnum++) { - int st = 0; - if (!dsa_doit[testnum]) - continue; - - /* DSA_generate_key(dsa_key[testnum]); */ - /* DSA_sign_setup(dsa_key[testnum],NULL); */ - for (i = 0; i < loopargs_len; i++) { - st = DSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2, - &loopargs[i].siglen, loopargs[i].dsa_key[testnum]); - if (st == 0) - break; - } - if (st == 0) { - BIO_printf(bio_err, - "DSA sign failure. No DSA sign will be done.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - } else { - pkey_print_message("sign", "dsa", - dsa_c[testnum][0], dsa_bits[testnum], - seconds.dsa); - Time_F(START); - count = run_benchmark(async_jobs, DSA_sign_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R3:%ld:%u:%.2f\n" - : "%ld %u bits DSA signs in %.2fs\n", - count, dsa_bits[testnum], d); - dsa_results[testnum][0] = (double)count / d; - rsa_count = count; - } - - for (i = 0; i < loopargs_len; i++) { - st = DSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2, - loopargs[i].siglen, loopargs[i].dsa_key[testnum]); - if (st <= 0) - break; - } - if (st <= 0) { - BIO_printf(bio_err, - "DSA verify failure. No DSA verify will be done.\n"); - ERR_print_errors(bio_err); - dsa_doit[testnum] = 0; - } else { - pkey_print_message("verify", "dsa", - dsa_c[testnum][1], dsa_bits[testnum], - seconds.dsa); - Time_F(START); - count = run_benchmark(async_jobs, DSA_verify_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R4:%ld:%u:%.2f\n" - : "%ld %u bits DSA verify in %.2fs\n", - count, dsa_bits[testnum], d); - dsa_results[testnum][1] = (double)count / d; - } - - if (rsa_count <= 1) { - /* if longer than 10s, don't do any more */ - for (testnum++; testnum < DSA_NUM; testnum++) - dsa_doit[testnum] = 0; - } - } -#endif /* OPENSSL_NO_DSA */ - -#ifndef OPENSSL_NO_EC - for (testnum = 0; testnum < ECDSA_NUM; testnum++) { - int st = 1; - - if (!ecdsa_doit[testnum]) - continue; /* Ignore Curve */ - for (i = 0; i < loopargs_len; i++) { - loopargs[i].ecdsa[testnum] = - EC_KEY_new_by_curve_name(test_curves[testnum].nid); - if (loopargs[i].ecdsa[testnum] == NULL) { - st = 0; - break; - } - } - if (st == 0) { - BIO_printf(bio_err, "ECDSA failure.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - } else { - for (i = 0; i < loopargs_len; i++) { - EC_KEY_precompute_mult(loopargs[i].ecdsa[testnum], NULL); - /* Perform ECDSA signature test */ - EC_KEY_generate_key(loopargs[i].ecdsa[testnum]); - st = ECDSA_sign(0, loopargs[i].buf, 20, loopargs[i].buf2, - &loopargs[i].siglen, - loopargs[i].ecdsa[testnum]); - if (st == 0) - break; - } - if (st == 0) { - BIO_printf(bio_err, - "ECDSA sign failure. No ECDSA sign will be done.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - } else { - pkey_print_message("sign", "ecdsa", - ecdsa_c[testnum][0], - test_curves[testnum].bits, seconds.ecdsa); - Time_F(START); - count = run_benchmark(async_jobs, ECDSA_sign_loop, loopargs); - d = Time_F(STOP); - - BIO_printf(bio_err, - mr ? "+R5:%ld:%u:%.2f\n" : - "%ld %u bits ECDSA signs in %.2fs \n", - count, test_curves[testnum].bits, d); - ecdsa_results[testnum][0] = (double)count / d; - rsa_count = count; - } - - /* Perform ECDSA verification test */ - for (i = 0; i < loopargs_len; i++) { - st = ECDSA_verify(0, loopargs[i].buf, 20, loopargs[i].buf2, - loopargs[i].siglen, - loopargs[i].ecdsa[testnum]); - if (st != 1) - break; - } - if (st != 1) { - BIO_printf(bio_err, - "ECDSA verify failure. No ECDSA verify will be done.\n"); - ERR_print_errors(bio_err); - ecdsa_doit[testnum] = 0; - } else { - pkey_print_message("verify", "ecdsa", - ecdsa_c[testnum][1], - test_curves[testnum].bits, seconds.ecdsa); - Time_F(START); - count = run_benchmark(async_jobs, ECDSA_verify_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R6:%ld:%u:%.2f\n" - : "%ld %u bits ECDSA verify in %.2fs\n", - count, test_curves[testnum].bits, d); - ecdsa_results[testnum][1] = (double)count / d; - } - - if (rsa_count <= 1) { - /* if longer than 10s, don't do any more */ - for (testnum++; testnum < ECDSA_NUM; testnum++) - ecdsa_doit[testnum] = 0; - } - } - } - - for (testnum = 0; testnum < EC_NUM; testnum++) { - int ecdh_checks = 1; - - if (!ecdh_doit[testnum]) - continue; - - for (i = 0; i < loopargs_len; i++) { - EVP_PKEY_CTX *kctx = NULL; - EVP_PKEY_CTX *test_ctx = NULL; - EVP_PKEY_CTX *ctx = NULL; - EVP_PKEY *key_A = NULL; - EVP_PKEY *key_B = NULL; - size_t outlen; - size_t test_outlen; - - /* Ensure that the error queue is empty */ - if (ERR_peek_error()) { - BIO_printf(bio_err, - "WARNING: the error queue contains previous unhandled errors.\n"); - ERR_print_errors(bio_err); - } - - /* Let's try to create a ctx directly from the NID: this works for - * curves like Curve25519 that are not implemented through the low - * level EC interface. - * If this fails we try creating a EVP_PKEY_EC generic param ctx, - * then we set the curve by NID before deriving the actual keygen - * ctx for that specific curve. */ - kctx = EVP_PKEY_CTX_new_id(test_curves[testnum].nid, NULL); /* keygen ctx from NID */ - if (!kctx) { - EVP_PKEY_CTX *pctx = NULL; - EVP_PKEY *params = NULL; - - /* If we reach this code EVP_PKEY_CTX_new_id() failed and a - * "int_ctx_new:unsupported algorithm" error was added to the - * error queue. - * We remove it from the error queue as we are handling it. */ - unsigned long error = ERR_peek_error(); /* peek the latest error in the queue */ - if (error == ERR_peek_last_error() && /* oldest and latest errors match */ - /* check that the error origin matches */ - ERR_GET_LIB(error) == ERR_LIB_EVP && - ERR_GET_FUNC(error) == EVP_F_INT_CTX_NEW && - ERR_GET_REASON(error) == EVP_R_UNSUPPORTED_ALGORITHM) - ERR_get_error(); /* pop error from queue */ - if (ERR_peek_error()) { - BIO_printf(bio_err, - "Unhandled error in the error queue during ECDH init.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - break; - } - - if ( /* Create the context for parameter generation */ - !(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) || - /* Initialise the parameter generation */ - !EVP_PKEY_paramgen_init(pctx) || - /* Set the curve by NID */ - !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, - test_curves - [testnum].nid) || - /* Create the parameter object params */ - !EVP_PKEY_paramgen(pctx, ¶ms)) { - ecdh_checks = 0; - BIO_printf(bio_err, "ECDH EC params init failure.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - break; - } - /* Create the context for the key generation */ - kctx = EVP_PKEY_CTX_new(params, NULL); - - EVP_PKEY_free(params); - params = NULL; - EVP_PKEY_CTX_free(pctx); - pctx = NULL; - } - if (kctx == NULL || /* keygen ctx is not null */ - EVP_PKEY_keygen_init(kctx) <= 0/* init keygen ctx */ ) { - ecdh_checks = 0; - BIO_printf(bio_err, "ECDH keygen failure.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - break; - } - - if (EVP_PKEY_keygen(kctx, &key_A) <= 0 || /* generate secret key A */ - EVP_PKEY_keygen(kctx, &key_B) <= 0 || /* generate secret key B */ - !(ctx = EVP_PKEY_CTX_new(key_A, NULL)) || /* derivation ctx from skeyA */ - EVP_PKEY_derive_init(ctx) <= 0 || /* init derivation ctx */ - EVP_PKEY_derive_set_peer(ctx, key_B) <= 0 || /* set peer pubkey in ctx */ - EVP_PKEY_derive(ctx, NULL, &outlen) <= 0 || /* determine max length */ - outlen == 0 || /* ensure outlen is a valid size */ - outlen > MAX_ECDH_SIZE /* avoid buffer overflow */ ) { - ecdh_checks = 0; - BIO_printf(bio_err, "ECDH key generation failure.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - break; - } - - /* Here we perform a test run, comparing the output of a*B and b*A; - * we try this here and assume that further EVP_PKEY_derive calls - * never fail, so we can skip checks in the actually benchmarked - * code, for maximum performance. */ - if (!(test_ctx = EVP_PKEY_CTX_new(key_B, NULL)) || /* test ctx from skeyB */ - !EVP_PKEY_derive_init(test_ctx) || /* init derivation test_ctx */ - !EVP_PKEY_derive_set_peer(test_ctx, key_A) || /* set peer pubkey in test_ctx */ - !EVP_PKEY_derive(test_ctx, NULL, &test_outlen) || /* determine max length */ - !EVP_PKEY_derive(ctx, loopargs[i].secret_a, &outlen) || /* compute a*B */ - !EVP_PKEY_derive(test_ctx, loopargs[i].secret_b, &test_outlen) || /* compute b*A */ - test_outlen != outlen /* compare output length */ ) { - ecdh_checks = 0; - BIO_printf(bio_err, "ECDH computation failure.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - break; - } - - /* Compare the computation results: CRYPTO_memcmp() returns 0 if equal */ - if (CRYPTO_memcmp(loopargs[i].secret_a, - loopargs[i].secret_b, outlen)) { - ecdh_checks = 0; - BIO_printf(bio_err, "ECDH computations don't match.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - break; - } - - loopargs[i].ecdh_ctx[testnum] = ctx; - loopargs[i].outlen[testnum] = outlen; - - EVP_PKEY_free(key_A); - EVP_PKEY_free(key_B); - EVP_PKEY_CTX_free(kctx); - kctx = NULL; - EVP_PKEY_CTX_free(test_ctx); - test_ctx = NULL; - } - if (ecdh_checks != 0) { - pkey_print_message("", "ecdh", - ecdh_c[testnum][0], - test_curves[testnum].bits, seconds.ecdh); - Time_F(START); - count = - run_benchmark(async_jobs, ECDH_EVP_derive_key_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R7:%ld:%d:%.2f\n" : - "%ld %u-bits ECDH ops in %.2fs\n", count, - test_curves[testnum].bits, d); - ecdh_results[testnum][0] = (double)count / d; - rsa_count = count; - } - - if (rsa_count <= 1) { - /* if longer than 10s, don't do any more */ - for (testnum++; testnum < OSSL_NELEM(ecdh_doit); testnum++) - ecdh_doit[testnum] = 0; - } - } - - for (testnum = 0; testnum < EdDSA_NUM; testnum++) { - int st = 1; - EVP_PKEY *ed_pkey = NULL; - EVP_PKEY_CTX *ed_pctx = NULL; - - if (!eddsa_doit[testnum]) - continue; /* Ignore Curve */ - for (i = 0; i < loopargs_len; i++) { - loopargs[i].eddsa_ctx[testnum] = EVP_MD_CTX_new(); - if (loopargs[i].eddsa_ctx[testnum] == NULL) { - st = 0; - break; - } - - if ((ed_pctx = EVP_PKEY_CTX_new_id(test_ed_curves[testnum].nid, NULL)) - == NULL - || EVP_PKEY_keygen_init(ed_pctx) <= 0 - || EVP_PKEY_keygen(ed_pctx, &ed_pkey) <= 0) { - st = 0; - EVP_PKEY_CTX_free(ed_pctx); - break; - } - EVP_PKEY_CTX_free(ed_pctx); - - if (!EVP_DigestSignInit(loopargs[i].eddsa_ctx[testnum], NULL, NULL, - NULL, ed_pkey)) { - st = 0; - EVP_PKEY_free(ed_pkey); - break; - } - EVP_PKEY_free(ed_pkey); - } - if (st == 0) { - BIO_printf(bio_err, "EdDSA failure.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - } else { - for (i = 0; i < loopargs_len; i++) { - /* Perform EdDSA signature test */ - loopargs[i].sigsize = test_ed_curves[testnum].sigsize; - st = EVP_DigestSign(loopargs[i].eddsa_ctx[testnum], - loopargs[i].buf2, &loopargs[i].sigsize, - loopargs[i].buf, 20); - if (st == 0) - break; - } - if (st == 0) { - BIO_printf(bio_err, - "EdDSA sign failure. No EdDSA sign will be done.\n"); - ERR_print_errors(bio_err); - rsa_count = 1; - } else { - pkey_print_message("sign", test_ed_curves[testnum].name, - eddsa_c[testnum][0], - test_ed_curves[testnum].bits, seconds.eddsa); - Time_F(START); - count = run_benchmark(async_jobs, EdDSA_sign_loop, loopargs); - d = Time_F(STOP); - - BIO_printf(bio_err, - mr ? "+R8:%ld:%u:%s:%.2f\n" : - "%ld %u bits %s signs in %.2fs \n", - count, test_ed_curves[testnum].bits, - test_ed_curves[testnum].name, d); - eddsa_results[testnum][0] = (double)count / d; - rsa_count = count; - } - - /* Perform EdDSA verification test */ - for (i = 0; i < loopargs_len; i++) { - st = EVP_DigestVerify(loopargs[i].eddsa_ctx[testnum], - loopargs[i].buf2, loopargs[i].sigsize, - loopargs[i].buf, 20); - if (st != 1) - break; - } - if (st != 1) { - BIO_printf(bio_err, - "EdDSA verify failure. No EdDSA verify will be done.\n"); - ERR_print_errors(bio_err); - eddsa_doit[testnum] = 0; - } else { - pkey_print_message("verify", test_ed_curves[testnum].name, - eddsa_c[testnum][1], - test_ed_curves[testnum].bits, seconds.eddsa); - Time_F(START); - count = run_benchmark(async_jobs, EdDSA_verify_loop, loopargs); - d = Time_F(STOP); - BIO_printf(bio_err, - mr ? "+R9:%ld:%u:%s:%.2f\n" - : "%ld %u bits %s verify in %.2fs\n", - count, test_ed_curves[testnum].bits, - test_ed_curves[testnum].name, d); - eddsa_results[testnum][1] = (double)count / d; - } - - if (rsa_count <= 1) { - /* if longer than 10s, don't do any more */ - for (testnum++; testnum < EdDSA_NUM; testnum++) - eddsa_doit[testnum] = 0; - } - } - } - -#endif /* OPENSSL_NO_EC */ -#ifndef NO_FORK - show_res: -#endif - if (!mr) { - printf("%s\n", OpenSSL_version(OPENSSL_VERSION)); - printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON)); - printf("options:"); - printf("%s ", BN_options()); -#ifndef OPENSSL_NO_MD2 - printf("%s ", MD2_options()); -#endif -#ifndef OPENSSL_NO_RC4 - printf("%s ", RC4_options()); -#endif -#ifndef OPENSSL_NO_DES - printf("%s ", DES_options()); -#endif - printf("%s ", AES_options()); -#ifndef OPENSSL_NO_IDEA - printf("%s ", IDEA_options()); -#endif -#ifndef OPENSSL_NO_BF - printf("%s ", BF_options()); -#endif - printf("\n%s\n", OpenSSL_version(OPENSSL_CFLAGS)); - } - - if (pr_header) { - if (mr) - printf("+H"); - else { - printf - ("The 'numbers' are in 1000s of bytes per second processed.\n"); - printf("type "); - } - for (testnum = 0; testnum < size_num; testnum++) - printf(mr ? ":%d" : "%7d bytes", lengths[testnum]); - printf("\n"); - } - - for (k = 0; k < ALGOR_NUM; k++) { - if (!doit[k]) - continue; - if (mr) - printf("+F:%u:%s", k, names[k]); - else - printf("%-13s", names[k]); - for (testnum = 0; testnum < size_num; testnum++) { - if (results[k][testnum] > 10000 && !mr) - printf(" %11.2fk", results[k][testnum] / 1e3); - else - printf(mr ? ":%.2f" : " %11.2f ", results[k][testnum]); - } - printf("\n"); - } -#ifndef OPENSSL_NO_RSA - testnum = 1; - for (k = 0; k < RSA_NUM; k++) { - if (!rsa_doit[k]) - continue; - if (testnum && !mr) { - printf("%18ssign verify sign/s verify/s\n", " "); - testnum = 0; - } - if (mr) - printf("+F2:%u:%u:%f:%f\n", - k, rsa_bits[k], rsa_results[k][0], rsa_results[k][1]); - else - printf("rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n", - rsa_bits[k], 1.0 / rsa_results[k][0], 1.0 / rsa_results[k][1], - rsa_results[k][0], rsa_results[k][1]); - } -#endif -#ifndef OPENSSL_NO_DSA - testnum = 1; - for (k = 0; k < DSA_NUM; k++) { - if (!dsa_doit[k]) - continue; - if (testnum && !mr) { - printf("%18ssign verify sign/s verify/s\n", " "); - testnum = 0; - } - if (mr) - printf("+F3:%u:%u:%f:%f\n", - k, dsa_bits[k], dsa_results[k][0], dsa_results[k][1]); - else - printf("dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n", - dsa_bits[k], 1.0 / dsa_results[k][0], 1.0 / dsa_results[k][1], - dsa_results[k][0], dsa_results[k][1]); - } -#endif -#ifndef OPENSSL_NO_EC - testnum = 1; - for (k = 0; k < OSSL_NELEM(ecdsa_doit); k++) { - if (!ecdsa_doit[k]) - continue; - if (testnum && !mr) { - printf("%30ssign verify sign/s verify/s\n", " "); - testnum = 0; - } - - if (mr) - printf("+F4:%u:%u:%f:%f\n", - k, test_curves[k].bits, - ecdsa_results[k][0], ecdsa_results[k][1]); - else - printf("%4u bits ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f\n", - test_curves[k].bits, test_curves[k].name, - 1.0 / ecdsa_results[k][0], 1.0 / ecdsa_results[k][1], - ecdsa_results[k][0], ecdsa_results[k][1]); - } - - testnum = 1; - for (k = 0; k < EC_NUM; k++) { - if (!ecdh_doit[k]) - continue; - if (testnum && !mr) { - printf("%30sop op/s\n", " "); - testnum = 0; - } - if (mr) - printf("+F5:%u:%u:%f:%f\n", - k, test_curves[k].bits, - ecdh_results[k][0], 1.0 / ecdh_results[k][0]); - - else - printf("%4u bits ecdh (%s) %8.4fs %8.1f\n", - test_curves[k].bits, test_curves[k].name, - 1.0 / ecdh_results[k][0], ecdh_results[k][0]); - } - - testnum = 1; - for (k = 0; k < OSSL_NELEM(eddsa_doit); k++) { - if (!eddsa_doit[k]) - continue; - if (testnum && !mr) { - printf("%30ssign verify sign/s verify/s\n", " "); - testnum = 0; - } - - if (mr) - printf("+F6:%u:%u:%s:%f:%f\n", - k, test_ed_curves[k].bits, test_ed_curves[k].name, - eddsa_results[k][0], eddsa_results[k][1]); - else - printf("%4u bits EdDSA (%s) %8.4fs %8.4fs %8.1f %8.1f\n", - test_ed_curves[k].bits, test_ed_curves[k].name, - 1.0 / eddsa_results[k][0], 1.0 / eddsa_results[k][1], - eddsa_results[k][0], eddsa_results[k][1]); - } -#endif - - ret = 0; - - end: - ERR_print_errors(bio_err); - for (i = 0; i < loopargs_len; i++) { - OPENSSL_free(loopargs[i].buf_malloc); - OPENSSL_free(loopargs[i].buf2_malloc); - -#ifndef OPENSSL_NO_RSA - for (k = 0; k < RSA_NUM; k++) - RSA_free(loopargs[i].rsa_key[k]); -#endif -#ifndef OPENSSL_NO_DSA - for (k = 0; k < DSA_NUM; k++) - DSA_free(loopargs[i].dsa_key[k]); -#endif -#ifndef OPENSSL_NO_EC - for (k = 0; k < ECDSA_NUM; k++) - EC_KEY_free(loopargs[i].ecdsa[k]); - for (k = 0; k < EC_NUM; k++) - EVP_PKEY_CTX_free(loopargs[i].ecdh_ctx[k]); - for (k = 0; k < EdDSA_NUM; k++) - EVP_MD_CTX_free(loopargs[i].eddsa_ctx[k]); - OPENSSL_free(loopargs[i].secret_a); - OPENSSL_free(loopargs[i].secret_b); -#endif - } - - if (async_jobs > 0) { - for (i = 0; i < loopargs_len; i++) - ASYNC_WAIT_CTX_free(loopargs[i].wait_ctx); - } - - if (async_init) { - ASYNC_cleanup_thread(); - } - OPENSSL_free(loopargs); - release_engine(e); - return ret; -} - -static void print_message(const char *s, long num, int length, int tm) -{ -#ifdef SIGALRM - BIO_printf(bio_err, - mr ? "+DT:%s:%d:%d\n" - : "Doing %s for %ds on %d size blocks: ", s, tm, length); - (void)BIO_flush(bio_err); - run = 1; - alarm(tm); -#else - BIO_printf(bio_err, - mr ? "+DN:%s:%ld:%d\n" - : "Doing %s %ld times on %d size blocks: ", s, num, length); - (void)BIO_flush(bio_err); -#endif -} - -static void pkey_print_message(const char *str, const char *str2, long num, - unsigned int bits, int tm) -{ -#ifdef SIGALRM - BIO_printf(bio_err, - mr ? "+DTP:%d:%s:%s:%d\n" - : "Doing %u bits %s %s's for %ds: ", bits, str, str2, tm); - (void)BIO_flush(bio_err); - run = 1; - alarm(tm); -#else - BIO_printf(bio_err, - mr ? "+DNP:%ld:%d:%s:%s\n" - : "Doing %ld %u bits %s %s's: ", num, bits, str, str2); - (void)BIO_flush(bio_err); -#endif -} - -static void print_result(int alg, int run_no, int count, double time_used) -{ - if (count == -1) { - BIO_puts(bio_err, "EVP error!\n"); - exit(1); - } - BIO_printf(bio_err, - mr ? "+R:%d:%s:%f\n" - : "%d %s's in %.2fs\n", count, names[alg], time_used); - results[alg][run_no] = ((double)count) / time_used * lengths[run_no]; -} - -#ifndef NO_FORK -static char *sstrsep(char **string, const char *delim) -{ - char isdelim[256]; - char *token = *string; - - if (**string == 0) - return NULL; - - memset(isdelim, 0, sizeof(isdelim)); - isdelim[0] = 1; - - while (*delim) { - isdelim[(unsigned char)(*delim)] = 1; - delim++; - } - - while (!isdelim[(unsigned char)(**string)]) { - (*string)++; - } - - if (**string) { - **string = 0; - (*string)++; - } - - return token; -} - -static int do_multi(int multi, int size_num) -{ - int n; - int fd[2]; - int *fds; - static char sep[] = ":"; - - fds = app_malloc(sizeof(*fds) * multi, "fd buffer for do_multi"); - for (n = 0; n < multi; ++n) { - if (pipe(fd) == -1) { - BIO_printf(bio_err, "pipe failure\n"); - exit(1); - } - fflush(stdout); - (void)BIO_flush(bio_err); - if (fork()) { - close(fd[1]); - fds[n] = fd[0]; - } else { - close(fd[0]); - close(1); - if (dup(fd[1]) == -1) { - BIO_printf(bio_err, "dup failed\n"); - exit(1); - } - close(fd[1]); - mr = 1; - usertime = 0; - free(fds); - return 0; - } - printf("Forked child %d\n", n); - } - - /* for now, assume the pipe is long enough to take all the output */ - for (n = 0; n < multi; ++n) { - FILE *f; - char buf[1024]; - char *p; - - f = fdopen(fds[n], "r"); - while (fgets(buf, sizeof(buf), f)) { - p = strchr(buf, '\n'); - if (p) - *p = '\0'; - if (buf[0] != '+') { - BIO_printf(bio_err, - "Don't understand line '%s' from child %d\n", buf, - n); - continue; - } - printf("Got: %s from %d\n", buf, n); - if (strncmp(buf, "+F:", 3) == 0) { - int alg; - int j; - - p = buf + 3; - alg = atoi(sstrsep(&p, sep)); - sstrsep(&p, sep); - for (j = 0; j < size_num; ++j) - results[alg][j] += atof(sstrsep(&p, sep)); - } else if (strncmp(buf, "+F2:", 4) == 0) { - int k; - double d; - - p = buf + 4; - k = atoi(sstrsep(&p, sep)); - sstrsep(&p, sep); - - d = atof(sstrsep(&p, sep)); - rsa_results[k][0] += d; - - d = atof(sstrsep(&p, sep)); - rsa_results[k][1] += d; - } -# ifndef OPENSSL_NO_DSA - else if (strncmp(buf, "+F3:", 4) == 0) { - int k; - double d; - - p = buf + 4; - k = atoi(sstrsep(&p, sep)); - sstrsep(&p, sep); - - d = atof(sstrsep(&p, sep)); - dsa_results[k][0] += d; - - d = atof(sstrsep(&p, sep)); - dsa_results[k][1] += d; - } -# endif -# ifndef OPENSSL_NO_EC - else if (strncmp(buf, "+F4:", 4) == 0) { - int k; - double d; - - p = buf + 4; - k = atoi(sstrsep(&p, sep)); - sstrsep(&p, sep); - - d = atof(sstrsep(&p, sep)); - ecdsa_results[k][0] += d; - - d = atof(sstrsep(&p, sep)); - ecdsa_results[k][1] += d; - } else if (strncmp(buf, "+F5:", 4) == 0) { - int k; - double d; - - p = buf + 4; - k = atoi(sstrsep(&p, sep)); - sstrsep(&p, sep); - - d = atof(sstrsep(&p, sep)); - ecdh_results[k][0] += d; - } else if (strncmp(buf, "+F6:", 4) == 0) { - int k; - double d; - - p = buf + 4; - k = atoi(sstrsep(&p, sep)); - sstrsep(&p, sep); - sstrsep(&p, sep); - - d = atof(sstrsep(&p, sep)); - eddsa_results[k][0] += d; - - d = atof(sstrsep(&p, sep)); - eddsa_results[k][1] += d; - } -# endif - - else if (strncmp(buf, "+H:", 3) == 0) { - ; - } else - BIO_printf(bio_err, "Unknown type '%s' from child %d\n", buf, - n); - } - - fclose(f); - } - free(fds); - return 1; -} -#endif - -static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single, - const openssl_speed_sec_t *seconds) -{ - static const int mblengths_list[] = - { 8 * 1024, 2 * 8 * 1024, 4 * 8 * 1024, 8 * 8 * 1024, 8 * 16 * 1024 }; - const int *mblengths = mblengths_list; - int j, count, keylen, num = OSSL_NELEM(mblengths_list); - const char *alg_name; - unsigned char *inp, *out, *key, no_key[32], no_iv[16]; - EVP_CIPHER_CTX *ctx; - double d = 0.0; - - if (lengths_single) { - mblengths = &lengths_single; - num = 1; - } - - inp = app_malloc(mblengths[num - 1], "multiblock input buffer"); - out = app_malloc(mblengths[num - 1] + 1024, "multiblock output buffer"); - ctx = EVP_CIPHER_CTX_new(); - EVP_EncryptInit_ex(ctx, evp_cipher, NULL, NULL, no_iv); - - keylen = EVP_CIPHER_CTX_key_length(ctx); - key = app_malloc(keylen, "evp_cipher key"); - EVP_CIPHER_CTX_rand_key(ctx, key); - EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL); - OPENSSL_clear_free(key, keylen); - - EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY, sizeof(no_key), no_key); - alg_name = OBJ_nid2ln(EVP_CIPHER_nid(evp_cipher)); - - for (j = 0; j < num; j++) { - print_message(alg_name, 0, mblengths[j], seconds->sym); - Time_F(START); - for (count = 0; run && count < 0x7fffffff; count++) { - unsigned char aad[EVP_AEAD_TLS1_AAD_LEN]; - EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param; - size_t len = mblengths[j]; - int packlen; - - memset(aad, 0, 8); /* avoid uninitialized values */ - aad[8] = 23; /* SSL3_RT_APPLICATION_DATA */ - aad[9] = 3; /* version */ - aad[10] = 2; - aad[11] = 0; /* length */ - aad[12] = 0; - mb_param.out = NULL; - mb_param.inp = aad; - mb_param.len = len; - mb_param.interleave = 8; - - packlen = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_AAD, - sizeof(mb_param), &mb_param); - - if (packlen > 0) { - mb_param.out = out; - mb_param.inp = inp; - mb_param.len = len; - EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT, - sizeof(mb_param), &mb_param); - } else { - int pad; - - RAND_bytes(out, 16); - len += 16; - aad[11] = (unsigned char)(len >> 8); - aad[12] = (unsigned char)(len); - pad = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_TLS1_AAD, - EVP_AEAD_TLS1_AAD_LEN, aad); - EVP_Cipher(ctx, out, inp, len + pad); - } - } - d = Time_F(STOP); - BIO_printf(bio_err, mr ? "+R:%d:%s:%f\n" - : "%d %s's in %.2fs\n", count, "evp", d); - results[D_EVP][j] = ((double)count) / d * mblengths[j]; - } - - if (mr) { - fprintf(stdout, "+H"); - for (j = 0; j < num; j++) - fprintf(stdout, ":%d", mblengths[j]); - fprintf(stdout, "\n"); - fprintf(stdout, "+F:%d:%s", D_EVP, alg_name); - for (j = 0; j < num; j++) - fprintf(stdout, ":%.2f", results[D_EVP][j]); - fprintf(stdout, "\n"); - } else { - fprintf(stdout, - "The 'numbers' are in 1000s of bytes per second processed.\n"); - fprintf(stdout, "type "); - for (j = 0; j < num; j++) - fprintf(stdout, "%7d bytes", mblengths[j]); - fprintf(stdout, "\n"); - fprintf(stdout, "%-24s", alg_name); - - for (j = 0; j < num; j++) { - if (results[D_EVP][j] > 10000) - fprintf(stdout, " %11.2fk", results[D_EVP][j] / 1e3); - else - fprintf(stdout, " %11.2f ", results[D_EVP][j]); - } - fprintf(stdout, "\n"); - } - - OPENSSL_free(inp); - OPENSSL_free(out); - EVP_CIPHER_CTX_free(ctx); -} diff --git a/contrib/libs/openssl/apps/spkac.c b/contrib/libs/openssl/apps/spkac.c deleted file mode 100644 index f384af6eb6..0000000000 --- a/contrib/libs/openssl/apps/spkac.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/conf.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/pem.h> - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_NOOUT, OPT_PUBKEY, OPT_VERIFY, OPT_IN, OPT_OUT, - OPT_ENGINE, OPT_KEY, OPT_CHALLENGE, OPT_PASSIN, OPT_SPKAC, - OPT_SPKSECT, OPT_KEYFORM -} OPTION_CHOICE; - -const OPTIONS spkac_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"in", OPT_IN, '<', "Input file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"key", OPT_KEY, '<', "Create SPKAC using private key"}, - {"keyform", OPT_KEYFORM, 'f', "Private key file format - default PEM (PEM, DER, or ENGINE)"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"challenge", OPT_CHALLENGE, 's', "Challenge string"}, - {"spkac", OPT_SPKAC, 's', "Alternative SPKAC name"}, - {"noout", OPT_NOOUT, '-', "Don't print SPKAC"}, - {"pubkey", OPT_PUBKEY, '-', "Output public key"}, - {"verify", OPT_VERIFY, '-', "Verify SPKAC signature"}, - {"spksect", OPT_SPKSECT, 's', - "Specify the name of an SPKAC-dedicated section of configuration"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int spkac_main(int argc, char **argv) -{ - BIO *out = NULL; - CONF *conf = NULL; - ENGINE *e = NULL; - EVP_PKEY *pkey = NULL; - NETSCAPE_SPKI *spki = NULL; - char *challenge = NULL, *keyfile = NULL; - char *infile = NULL, *outfile = NULL, *passinarg = NULL, *passin = NULL; - char *spkstr = NULL, *prog; - const char *spkac = "SPKAC", *spksect = "default"; - int i, ret = 1, verify = 0, noout = 0, pubkey = 0; - int keyformat = FORMAT_PEM; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, spkac_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(spkac_options); - ret = 0; - goto end; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_PUBKEY: - pubkey = 1; - break; - case OPT_VERIFY: - verify = 1; - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_KEY: - keyfile = opt_arg(); - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyformat)) - goto opthelp; - break; - case OPT_CHALLENGE: - challenge = opt_arg(); - break; - case OPT_SPKAC: - spkac = opt_arg(); - break; - case OPT_SPKSECT: - spksect = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - } - } - argc = opt_num_rest(); - if (argc != 0) - goto opthelp; - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - if (keyfile != NULL) { - pkey = load_key(strcmp(keyfile, "-") ? keyfile : NULL, - keyformat, 1, passin, e, "private key"); - if (pkey == NULL) - goto end; - spki = NETSCAPE_SPKI_new(); - if (spki == NULL) - goto end; - if (challenge != NULL) - ASN1_STRING_set(spki->spkac->challenge, - challenge, (int)strlen(challenge)); - NETSCAPE_SPKI_set_pubkey(spki, pkey); - NETSCAPE_SPKI_sign(spki, pkey, EVP_md5()); - spkstr = NETSCAPE_SPKI_b64_encode(spki); - if (spkstr == NULL) - goto end; - - out = bio_open_default(outfile, 'w', FORMAT_TEXT); - if (out == NULL) { - OPENSSL_free(spkstr); - goto end; - } - BIO_printf(out, "SPKAC=%s\n", spkstr); - OPENSSL_free(spkstr); - ret = 0; - goto end; - } - - if ((conf = app_load_config(infile)) == NULL) - goto end; - - spkstr = NCONF_get_string(conf, spksect, spkac); - - if (spkstr == NULL) { - BIO_printf(bio_err, "Can't find SPKAC called \"%s\"\n", spkac); - ERR_print_errors(bio_err); - goto end; - } - - spki = NETSCAPE_SPKI_b64_decode(spkstr, -1); - - if (spki == NULL) { - BIO_printf(bio_err, "Error loading SPKAC\n"); - ERR_print_errors(bio_err); - goto end; - } - - out = bio_open_default(outfile, 'w', FORMAT_TEXT); - if (out == NULL) - goto end; - - if (!noout) - NETSCAPE_SPKI_print(out, spki); - pkey = NETSCAPE_SPKI_get_pubkey(spki); - if (verify) { - i = NETSCAPE_SPKI_verify(spki, pkey); - if (i > 0) { - BIO_printf(bio_err, "Signature OK\n"); - } else { - BIO_printf(bio_err, "Signature Failure\n"); - ERR_print_errors(bio_err); - goto end; - } - } - if (pubkey) - PEM_write_bio_PUBKEY(out, pkey); - - ret = 0; - - end: - NCONF_free(conf); - NETSCAPE_SPKI_free(spki); - BIO_free_all(out); - EVP_PKEY_free(pkey); - release_engine(e); - OPENSSL_free(passin); - return ret; -} diff --git a/contrib/libs/openssl/apps/srp.c b/contrib/libs/openssl/apps/srp.c deleted file mode 100644 index 6c58173879..0000000000 --- a/contrib/libs/openssl/apps/srp.c +++ /dev/null @@ -1,608 +0,0 @@ -/* - * Copyright 2004-2020 The OpenSSL Project Authors. All Rights Reserved. - * Copyright (c) 2004, EdelKey Project. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - * - * Originally written by Christophe Renou and Peter Sylvester, - * for the EdelKey project. - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <openssl/conf.h> -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/txt_db.h> -#include <openssl/buffer.h> -#include <openssl/srp.h> -#include "apps.h" -#include "progs.h" - -#define BASE_SECTION "srp" -#define CONFIG_FILE "openssl.cnf" - - -#define ENV_DATABASE "srpvfile" -#define ENV_DEFAULT_SRP "default_srp" - -static int get_index(CA_DB *db, char *id, char type) -{ - char **pp; - int i; - if (id == NULL) - return -1; - if (type == DB_SRP_INDEX) { - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - pp = sk_OPENSSL_PSTRING_value(db->db->data, i); - if (pp[DB_srptype][0] == DB_SRP_INDEX - && strcmp(id, pp[DB_srpid]) == 0) - return i; - } - } else { - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - pp = sk_OPENSSL_PSTRING_value(db->db->data, i); - - if (pp[DB_srptype][0] != DB_SRP_INDEX - && strcmp(id, pp[DB_srpid]) == 0) - return i; - } - } - - return -1; -} - -static void print_entry(CA_DB *db, int indx, int verbose, char *s) -{ - if (indx >= 0 && verbose) { - int j; - char **pp = sk_OPENSSL_PSTRING_value(db->db->data, indx); - BIO_printf(bio_err, "%s \"%s\"\n", s, pp[DB_srpid]); - for (j = 0; j < DB_NUMBER; j++) { - BIO_printf(bio_err, " %d = \"%s\"\n", j, pp[j]); - } - } -} - -static void print_index(CA_DB *db, int indexindex, int verbose) -{ - print_entry(db, indexindex, verbose, "g N entry"); -} - -static void print_user(CA_DB *db, int userindex, int verbose) -{ - if (verbose > 0) { - char **pp = sk_OPENSSL_PSTRING_value(db->db->data, userindex); - - if (pp[DB_srptype][0] != 'I') { - print_entry(db, userindex, verbose, "User entry"); - print_entry(db, get_index(db, pp[DB_srpgN], 'I'), verbose, - "g N entry"); - } - - } -} - -static int update_index(CA_DB *db, char **row) -{ - char **irow; - int i; - - irow = app_malloc(sizeof(*irow) * (DB_NUMBER + 1), "row pointers"); - for (i = 0; i < DB_NUMBER; i++) - irow[i] = row[i]; - irow[DB_NUMBER] = NULL; - - if (!TXT_DB_insert(db->db, irow)) { - BIO_printf(bio_err, "failed to update srpvfile\n"); - BIO_printf(bio_err, "TXT_DB error number %ld\n", db->db->error); - OPENSSL_free(irow); - return 0; - } - return 1; -} - -static char *lookup_conf(const CONF *conf, const char *section, const char *tag) -{ - char *entry = NCONF_get_string(conf, section, tag); - if (entry == NULL) - BIO_printf(bio_err, "variable lookup failed for %s::%s\n", section, tag); - return entry; -} - -static char *srp_verify_user(const char *user, const char *srp_verifier, - char *srp_usersalt, const char *g, const char *N, - const char *passin, int verbose) -{ - char password[1025]; - PW_CB_DATA cb_tmp; - char *verifier = NULL; - char *gNid = NULL; - int len; - - cb_tmp.prompt_info = user; - cb_tmp.password = passin; - - len = password_callback(password, sizeof(password)-1, 0, &cb_tmp); - if (len > 0) { - password[len] = 0; - if (verbose) - BIO_printf(bio_err, - "Validating\n user=\"%s\"\n srp_verifier=\"%s\"\n srp_usersalt=\"%s\"\n g=\"%s\"\n N=\"%s\"\n", - user, srp_verifier, srp_usersalt, g, N); - if (verbose > 1) - BIO_printf(bio_err, "Pass %s\n", password); - - OPENSSL_assert(srp_usersalt != NULL); - if ((gNid = SRP_create_verifier(user, password, &srp_usersalt, - &verifier, N, g)) == NULL) { - BIO_printf(bio_err, "Internal error validating SRP verifier\n"); - } else { - if (strcmp(verifier, srp_verifier)) - gNid = NULL; - OPENSSL_free(verifier); - } - OPENSSL_cleanse(password, len); - } - return gNid; -} - -static char *srp_create_user(char *user, char **srp_verifier, - char **srp_usersalt, char *g, char *N, - char *passout, int verbose) -{ - char password[1025]; - PW_CB_DATA cb_tmp; - char *gNid = NULL; - char *salt = NULL; - int len; - cb_tmp.prompt_info = user; - cb_tmp.password = passout; - - len = password_callback(password, sizeof(password)-1, 1, &cb_tmp); - if (len > 0) { - password[len] = 0; - if (verbose) - BIO_printf(bio_err, "Creating\n user=\"%s\"\n g=\"%s\"\n N=\"%s\"\n", - user, g, N); - if ((gNid = SRP_create_verifier(user, password, &salt, - srp_verifier, N, g)) == NULL) { - BIO_printf(bio_err, "Internal error creating SRP verifier\n"); - } else { - *srp_usersalt = salt; - } - OPENSSL_cleanse(password, len); - if (verbose > 1) - BIO_printf(bio_err, "gNid=%s salt =\"%s\"\n verifier =\"%s\"\n", - gNid, salt, *srp_verifier); - - } - return gNid; -} - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_VERBOSE, OPT_CONFIG, OPT_NAME, OPT_SRPVFILE, OPT_ADD, - OPT_DELETE, OPT_MODIFY, OPT_LIST, OPT_GN, OPT_USERINFO, - OPT_PASSIN, OPT_PASSOUT, OPT_ENGINE, OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS srp_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"verbose", OPT_VERBOSE, '-', "Talk a lot while doing things"}, - {"config", OPT_CONFIG, '<', "A config file"}, - {"name", OPT_NAME, 's', "The particular srp definition to use"}, - {"srpvfile", OPT_SRPVFILE, '<', "The srp verifier file name"}, - {"add", OPT_ADD, '-', "Add a user and srp verifier"}, - {"modify", OPT_MODIFY, '-', - "Modify the srp verifier of an existing user"}, - {"delete", OPT_DELETE, '-', "Delete user from verifier file"}, - {"list", OPT_LIST, '-', "List users"}, - {"gn", OPT_GN, 's', "Set g and N values to be used for new verifier"}, - {"userinfo", OPT_USERINFO, 's', "Additional info to be set for user"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, - OPT_R_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int srp_main(int argc, char **argv) -{ - ENGINE *e = NULL; - CA_DB *db = NULL; - CONF *conf = NULL; - int gNindex = -1, maxgN = -1, ret = 1, errors = 0, verbose = 0, i; - int doupdatedb = 0, mode = OPT_ERR; - char *user = NULL, *passinarg = NULL, *passoutarg = NULL; - char *passin = NULL, *passout = NULL, *gN = NULL, *userinfo = NULL; - char *section = NULL; - char **gNrow = NULL, *configfile = NULL; - char *srpvfile = NULL, **pp, *prog; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, srp_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(srp_options); - ret = 0; - goto end; - case OPT_VERBOSE: - verbose++; - break; - case OPT_CONFIG: - configfile = opt_arg(); - break; - case OPT_NAME: - section = opt_arg(); - break; - case OPT_SRPVFILE: - srpvfile = opt_arg(); - break; - case OPT_ADD: - case OPT_DELETE: - case OPT_MODIFY: - case OPT_LIST: - if (mode != OPT_ERR) { - BIO_printf(bio_err, - "%s: Only one of -add/-delete/-modify/-list\n", - prog); - goto opthelp; - } - mode = o; - break; - case OPT_GN: - gN = opt_arg(); - break; - case OPT_USERINFO: - userinfo = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_PASSOUT: - passoutarg = opt_arg(); - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (srpvfile != NULL && configfile != NULL) { - BIO_printf(bio_err, - "-srpvfile and -configfile cannot be specified together.\n"); - goto end; - } - if (mode == OPT_ERR) { - BIO_printf(bio_err, - "Exactly one of the options -add, -delete, -modify -list must be specified.\n"); - goto opthelp; - } - if (mode == OPT_DELETE || mode == OPT_MODIFY || mode == OPT_ADD) { - if (argc == 0) { - BIO_printf(bio_err, "Need at least one user.\n"); - goto opthelp; - } - user = *argv++; - } - if ((passinarg != NULL || passoutarg != NULL) && argc != 1) { - BIO_printf(bio_err, - "-passin, -passout arguments only valid with one user.\n"); - goto opthelp; - } - - if (!app_passwd(passinarg, passoutarg, &passin, &passout)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - - if (srpvfile == NULL) { - if (configfile == NULL) - configfile = default_config_file; - - if (verbose) - BIO_printf(bio_err, "Using configuration from %s\n", - configfile); - conf = app_load_config(configfile); - if (conf == NULL) - goto end; - if (configfile != default_config_file && !app_load_modules(conf)) - goto end; - - /* Lets get the config section we are using */ - if (section == NULL) { - if (verbose) - BIO_printf(bio_err, - "trying to read " ENV_DEFAULT_SRP - " in " BASE_SECTION "\n"); - - section = lookup_conf(conf, BASE_SECTION, ENV_DEFAULT_SRP); - if (section == NULL) - goto end; - } - - app_RAND_load_conf(conf, BASE_SECTION); - - if (verbose) - BIO_printf(bio_err, - "trying to read " ENV_DATABASE " in section \"%s\"\n", - section); - - srpvfile = lookup_conf(conf, section, ENV_DATABASE); - if (srpvfile == NULL) - goto end; - } - - if (verbose) - BIO_printf(bio_err, "Trying to read SRP verifier file \"%s\"\n", - srpvfile); - - db = load_index(srpvfile, NULL); - if (db == NULL) - goto end; - - /* Lets check some fields */ - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - pp = sk_OPENSSL_PSTRING_value(db->db->data, i); - - if (pp[DB_srptype][0] == DB_SRP_INDEX) { - maxgN = i; - if ((gNindex < 0) && (gN != NULL) && strcmp(gN, pp[DB_srpid]) == 0) - gNindex = i; - - print_index(db, i, verbose > 1); - } - } - - if (verbose) - BIO_printf(bio_err, "Database initialised\n"); - - if (gNindex >= 0) { - gNrow = sk_OPENSSL_PSTRING_value(db->db->data, gNindex); - print_entry(db, gNindex, verbose > 1, "Default g and N"); - } else if (maxgN > 0 && !SRP_get_default_gN(gN)) { - BIO_printf(bio_err, "No g and N value for index \"%s\"\n", gN); - goto end; - } else { - if (verbose) - BIO_printf(bio_err, "Database has no g N information.\n"); - gNrow = NULL; - } - - if (verbose > 1) - BIO_printf(bio_err, "Starting user processing\n"); - - while (mode == OPT_LIST || user != NULL) { - int userindex = -1; - - if (user != NULL && verbose > 1) - BIO_printf(bio_err, "Processing user \"%s\"\n", user); - if ((userindex = get_index(db, user, 'U')) >= 0) - print_user(db, userindex, (verbose > 0) || mode == OPT_LIST); - - if (mode == OPT_LIST) { - if (user == NULL) { - BIO_printf(bio_err, "List all users\n"); - - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) - print_user(db, i, 1); - } else if (userindex < 0) { - BIO_printf(bio_err, - "user \"%s\" does not exist, ignored. t\n", user); - errors++; - } - } else if (mode == OPT_ADD) { - if (userindex >= 0) { - /* reactivation of a new user */ - char **row = - sk_OPENSSL_PSTRING_value(db->db->data, userindex); - BIO_printf(bio_err, "user \"%s\" reactivated.\n", user); - row[DB_srptype][0] = 'V'; - - doupdatedb = 1; - } else { - char *row[DB_NUMBER]; - char *gNid; - row[DB_srpverifier] = NULL; - row[DB_srpsalt] = NULL; - row[DB_srpinfo] = NULL; - if (! - (gNid = - srp_create_user(user, &(row[DB_srpverifier]), - &(row[DB_srpsalt]), - gNrow ? gNrow[DB_srpsalt] : gN, - gNrow ? gNrow[DB_srpverifier] : NULL, - passout, verbose))) { - BIO_printf(bio_err, - "Cannot create srp verifier for user \"%s\", operation abandoned .\n", - user); - errors++; - goto end; - } - row[DB_srpid] = OPENSSL_strdup(user); - row[DB_srptype] = OPENSSL_strdup("v"); - row[DB_srpgN] = OPENSSL_strdup(gNid); - - if ((row[DB_srpid] == NULL) - || (row[DB_srpgN] == NULL) - || (row[DB_srptype] == NULL) - || (row[DB_srpverifier] == NULL) - || (row[DB_srpsalt] == NULL) - || (userinfo - && ((row[DB_srpinfo] = OPENSSL_strdup(userinfo)) == NULL)) - || !update_index(db, row)) { - OPENSSL_free(row[DB_srpid]); - OPENSSL_free(row[DB_srpgN]); - OPENSSL_free(row[DB_srpinfo]); - OPENSSL_free(row[DB_srptype]); - OPENSSL_free(row[DB_srpverifier]); - OPENSSL_free(row[DB_srpsalt]); - goto end; - } - doupdatedb = 1; - } - } else if (mode == OPT_MODIFY) { - if (userindex < 0) { - BIO_printf(bio_err, - "user \"%s\" does not exist, operation ignored.\n", - user); - errors++; - } else { - - char **row = - sk_OPENSSL_PSTRING_value(db->db->data, userindex); - char type = row[DB_srptype][0]; - if (type == 'v') { - BIO_printf(bio_err, - "user \"%s\" already updated, operation ignored.\n", - user); - errors++; - } else { - char *gNid; - - if (row[DB_srptype][0] == 'V') { - int user_gN; - char **irow = NULL; - if (verbose) - BIO_printf(bio_err, - "Verifying password for user \"%s\"\n", - user); - if ((user_gN = - get_index(db, row[DB_srpgN], DB_SRP_INDEX)) >= 0) - irow = - sk_OPENSSL_PSTRING_value(db->db->data, - userindex); - - if (!srp_verify_user - (user, row[DB_srpverifier], row[DB_srpsalt], - irow ? irow[DB_srpsalt] : row[DB_srpgN], - irow ? irow[DB_srpverifier] : NULL, passin, - verbose)) { - BIO_printf(bio_err, - "Invalid password for user \"%s\", operation abandoned.\n", - user); - errors++; - goto end; - } - } - if (verbose) - BIO_printf(bio_err, "Password for user \"%s\" ok.\n", - user); - - if (! - (gNid = - srp_create_user(user, &(row[DB_srpverifier]), - &(row[DB_srpsalt]), - gNrow ? gNrow[DB_srpsalt] : NULL, - gNrow ? gNrow[DB_srpverifier] : NULL, - passout, verbose))) { - BIO_printf(bio_err, - "Cannot create srp verifier for user \"%s\", operation abandoned.\n", - user); - errors++; - goto end; - } - - row[DB_srptype][0] = 'v'; - row[DB_srpgN] = OPENSSL_strdup(gNid); - - if (row[DB_srpid] == NULL - || row[DB_srpgN] == NULL - || row[DB_srptype] == NULL - || row[DB_srpverifier] == NULL - || row[DB_srpsalt] == NULL - || (userinfo - && ((row[DB_srpinfo] = OPENSSL_strdup(userinfo)) - == NULL))) - goto end; - - doupdatedb = 1; - } - } - } else if (mode == OPT_DELETE) { - if (userindex < 0) { - BIO_printf(bio_err, - "user \"%s\" does not exist, operation ignored. t\n", - user); - errors++; - } else { - char **xpp = sk_OPENSSL_PSTRING_value(db->db->data, userindex); - - BIO_printf(bio_err, "user \"%s\" revoked. t\n", user); - xpp[DB_srptype][0] = 'R'; - doupdatedb = 1; - } - } - user = *argv++; - if (user == NULL) { - /* no more processing in any mode if no users left */ - break; - } - } - - if (verbose) - BIO_printf(bio_err, "User procession done.\n"); - - if (doupdatedb) { - /* Lets check some fields */ - for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++) { - pp = sk_OPENSSL_PSTRING_value(db->db->data, i); - - if (pp[DB_srptype][0] == 'v') { - pp[DB_srptype][0] = 'V'; - print_user(db, i, verbose); - } - } - - if (verbose) - BIO_printf(bio_err, "Trying to update srpvfile.\n"); - if (!save_index(srpvfile, "new", db)) - goto end; - - if (verbose) - BIO_printf(bio_err, "Temporary srpvfile created.\n"); - if (!rotate_index(srpvfile, "new", "old")) - goto end; - - if (verbose) - BIO_printf(bio_err, "srpvfile updated.\n"); - } - - ret = (errors != 0); - end: - if (errors != 0) - if (verbose) - BIO_printf(bio_err, "User errors %d.\n", errors); - - if (verbose) - BIO_printf(bio_err, "SRP terminating with code %d.\n", ret); - - OPENSSL_free(passin); - OPENSSL_free(passout); - if (ret) - ERR_print_errors(bio_err); - NCONF_free(conf); - free_index(db); - release_engine(e); - return ret; -} diff --git a/contrib/libs/openssl/apps/storeutl.c b/contrib/libs/openssl/apps/storeutl.c deleted file mode 100644 index 644fe28499..0000000000 --- a/contrib/libs/openssl/apps/storeutl.c +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> - -#include "apps.h" -#include "progs.h" -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/store.h> -#include <openssl/x509v3.h> /* s2i_ASN1_INTEGER */ - -static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata, - int expected, int criterion, OSSL_STORE_SEARCH *search, - int text, int noout, int recursive, int indent, BIO *out, - const char *prog); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ENGINE, OPT_OUT, OPT_PASSIN, - OPT_NOOUT, OPT_TEXT, OPT_RECURSIVE, - OPT_SEARCHFOR_CERTS, OPT_SEARCHFOR_KEYS, OPT_SEARCHFOR_CRLS, - OPT_CRITERION_SUBJECT, OPT_CRITERION_ISSUER, OPT_CRITERION_SERIAL, - OPT_CRITERION_FINGERPRINT, OPT_CRITERION_ALIAS, - OPT_MD -} OPTION_CHOICE; - -const OPTIONS storeutl_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] uri\nValid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"out", OPT_OUT, '>', "Output file - default stdout"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"text", OPT_TEXT, '-', "Print a text form of the objects"}, - {"noout", OPT_NOOUT, '-', "No PEM output, just status"}, - {"certs", OPT_SEARCHFOR_CERTS, '-', "Search for certificates only"}, - {"keys", OPT_SEARCHFOR_KEYS, '-', "Search for keys only"}, - {"crls", OPT_SEARCHFOR_CRLS, '-', "Search for CRLs only"}, - {"subject", OPT_CRITERION_SUBJECT, 's', "Search by subject"}, - {"issuer", OPT_CRITERION_ISSUER, 's', "Search by issuer and serial, issuer name"}, - {"serial", OPT_CRITERION_SERIAL, 's', "Search by issuer and serial, serial number"}, - {"fingerprint", OPT_CRITERION_FINGERPRINT, 's', "Search by public key fingerprint, given in hex"}, - {"alias", OPT_CRITERION_ALIAS, 's', "Search by alias"}, - {"", OPT_MD, '-', "Any supported digest"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"r", OPT_RECURSIVE, '-', "Recurse through names"}, - {NULL} -}; - -int storeutl_main(int argc, char *argv[]) -{ - int ret = 1, noout = 0, text = 0, recursive = 0; - char *outfile = NULL, *passin = NULL, *passinarg = NULL; - BIO *out = NULL; - ENGINE *e = NULL; - OPTION_CHOICE o; - char *prog = opt_init(argc, argv, storeutl_options); - PW_CB_DATA pw_cb_data; - int expected = 0; - int criterion = 0; - X509_NAME *subject = NULL, *issuer = NULL; - ASN1_INTEGER *serial = NULL; - unsigned char *fingerprint = NULL; - size_t fingerprintlen = 0; - char *alias = NULL; - OSSL_STORE_SEARCH *search = NULL; - const EVP_MD *digest = NULL; - - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(storeutl_options); - ret = 0; - goto end; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_NOOUT: - noout = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_RECURSIVE: - recursive = 1; - break; - case OPT_SEARCHFOR_CERTS: - case OPT_SEARCHFOR_KEYS: - case OPT_SEARCHFOR_CRLS: - if (expected != 0) { - BIO_printf(bio_err, "%s: only one search type can be given.\n", - prog); - goto end; - } - { - static const struct { - enum OPTION_choice choice; - int type; - } map[] = { - {OPT_SEARCHFOR_CERTS, OSSL_STORE_INFO_CERT}, - {OPT_SEARCHFOR_KEYS, OSSL_STORE_INFO_PKEY}, - {OPT_SEARCHFOR_CRLS, OSSL_STORE_INFO_CRL}, - }; - size_t i; - - for (i = 0; i < OSSL_NELEM(map); i++) { - if (o == map[i].choice) { - expected = map[i].type; - break; - } - } - /* - * If expected wasn't set at this point, it means the map - * isn't synchronised with the possible options leading here. - */ - OPENSSL_assert(expected != 0); - } - break; - case OPT_CRITERION_SUBJECT: - if (criterion != 0) { - BIO_printf(bio_err, "%s: criterion already given.\n", - prog); - goto end; - } - criterion = OSSL_STORE_SEARCH_BY_NAME; - if (subject != NULL) { - BIO_printf(bio_err, "%s: subject already given.\n", - prog); - goto end; - } - if ((subject = parse_name(opt_arg(), MBSTRING_UTF8, 1)) == NULL) { - BIO_printf(bio_err, "%s: can't parse subject argument.\n", - prog); - goto end; - } - break; - case OPT_CRITERION_ISSUER: - if (criterion != 0 - || (criterion == OSSL_STORE_SEARCH_BY_ISSUER_SERIAL - && issuer != NULL)) { - BIO_printf(bio_err, "%s: criterion already given.\n", - prog); - goto end; - } - criterion = OSSL_STORE_SEARCH_BY_ISSUER_SERIAL; - if (issuer != NULL) { - BIO_printf(bio_err, "%s: issuer already given.\n", - prog); - goto end; - } - if ((issuer = parse_name(opt_arg(), MBSTRING_UTF8, 1)) == NULL) { - BIO_printf(bio_err, "%s: can't parse issuer argument.\n", - prog); - goto end; - } - break; - case OPT_CRITERION_SERIAL: - if (criterion != 0 - || (criterion == OSSL_STORE_SEARCH_BY_ISSUER_SERIAL - && serial != NULL)) { - BIO_printf(bio_err, "%s: criterion already given.\n", - prog); - goto end; - } - criterion = OSSL_STORE_SEARCH_BY_ISSUER_SERIAL; - if (serial != NULL) { - BIO_printf(bio_err, "%s: serial number already given.\n", - prog); - goto end; - } - if ((serial = s2i_ASN1_INTEGER(NULL, opt_arg())) == NULL) { - BIO_printf(bio_err, "%s: can't parse serial number argument.\n", - prog); - goto end; - } - break; - case OPT_CRITERION_FINGERPRINT: - if (criterion != 0 - || (criterion == OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT - && fingerprint != NULL)) { - BIO_printf(bio_err, "%s: criterion already given.\n", - prog); - goto end; - } - criterion = OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT; - if (fingerprint != NULL) { - BIO_printf(bio_err, "%s: fingerprint already given.\n", - prog); - goto end; - } - { - long tmplen = 0; - - if ((fingerprint = OPENSSL_hexstr2buf(opt_arg(), &tmplen)) - == NULL) { - BIO_printf(bio_err, - "%s: can't parse fingerprint argument.\n", - prog); - goto end; - } - fingerprintlen = (size_t)tmplen; - } - break; - case OPT_CRITERION_ALIAS: - if (criterion != 0) { - BIO_printf(bio_err, "%s: criterion already given.\n", - prog); - goto end; - } - criterion = OSSL_STORE_SEARCH_BY_ALIAS; - if (alias != NULL) { - BIO_printf(bio_err, "%s: alias already given.\n", - prog); - goto end; - } - if ((alias = OPENSSL_strdup(opt_arg())) == NULL) { - BIO_printf(bio_err, "%s: can't parse alias argument.\n", - prog); - goto end; - } - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_MD: - if (!opt_md(opt_unknown(), &digest)) - goto opthelp; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - - if (argc == 0) { - BIO_printf(bio_err, "%s: No URI given, nothing to do...\n", prog); - goto opthelp; - } - if (argc > 1) { - BIO_printf(bio_err, "%s: Unknown extra parameters after URI\n", prog); - goto opthelp; - } - - if (criterion != 0) { - switch (criterion) { - case OSSL_STORE_SEARCH_BY_NAME: - if ((search = OSSL_STORE_SEARCH_by_name(subject)) == NULL) { - ERR_print_errors(bio_err); - goto end; - } - break; - case OSSL_STORE_SEARCH_BY_ISSUER_SERIAL: - if (issuer == NULL || serial == NULL) { - BIO_printf(bio_err, - "%s: both -issuer and -serial must be given.\n", - prog); - goto end; - } - if ((search = OSSL_STORE_SEARCH_by_issuer_serial(issuer, serial)) - == NULL) { - ERR_print_errors(bio_err); - goto end; - } - break; - case OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT: - if ((search = OSSL_STORE_SEARCH_by_key_fingerprint(digest, - fingerprint, - fingerprintlen)) - == NULL) { - ERR_print_errors(bio_err); - goto end; - } - break; - case OSSL_STORE_SEARCH_BY_ALIAS: - if ((search = OSSL_STORE_SEARCH_by_alias(alias)) == NULL) { - ERR_print_errors(bio_err); - goto end; - } - break; - } - } - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting passwords\n"); - goto end; - } - pw_cb_data.password = passin; - pw_cb_data.prompt_info = argv[0]; - - out = bio_open_default(outfile, 'w', FORMAT_TEXT); - if (out == NULL) - goto end; - - ret = process(argv[0], get_ui_method(), &pw_cb_data, - expected, criterion, search, - text, noout, recursive, 0, out, prog); - - end: - OPENSSL_free(fingerprint); - OPENSSL_free(alias); - ASN1_INTEGER_free(serial); - X509_NAME_free(subject); - X509_NAME_free(issuer); - OSSL_STORE_SEARCH_free(search); - BIO_free_all(out); - OPENSSL_free(passin); - release_engine(e); - return ret; -} - -static int indent_printf(int indent, BIO *bio, const char *format, ...) -{ - va_list args; - int ret; - - va_start(args, format); - - ret = BIO_printf(bio, "%*s", indent, "") + BIO_vprintf(bio, format, args); - - va_end(args); - return ret; -} - -static int process(const char *uri, const UI_METHOD *uimeth, PW_CB_DATA *uidata, - int expected, int criterion, OSSL_STORE_SEARCH *search, - int text, int noout, int recursive, int indent, BIO *out, - const char *prog) -{ - OSSL_STORE_CTX *store_ctx = NULL; - int ret = 1, items = 0; - - if ((store_ctx = OSSL_STORE_open(uri, uimeth, uidata, NULL, NULL)) - == NULL) { - BIO_printf(bio_err, "Couldn't open file or uri %s\n", uri); - ERR_print_errors(bio_err); - return ret; - } - - if (expected != 0) { - if (!OSSL_STORE_expect(store_ctx, expected)) { - ERR_print_errors(bio_err); - goto end2; - } - } - - if (criterion != 0) { - if (!OSSL_STORE_supports_search(store_ctx, criterion)) { - BIO_printf(bio_err, - "%s: the store scheme doesn't support the given search criteria.\n", - prog); - goto end2; - } - - if (!OSSL_STORE_find(store_ctx, search)) { - ERR_print_errors(bio_err); - goto end2; - } - } - - /* From here on, we count errors, and we'll return the count at the end */ - ret = 0; - - for (;;) { - OSSL_STORE_INFO *info = OSSL_STORE_load(store_ctx); - int type = info == NULL ? 0 : OSSL_STORE_INFO_get_type(info); - const char *infostr = - info == NULL ? NULL : OSSL_STORE_INFO_type_string(type); - - if (info == NULL) { - if (OSSL_STORE_eof(store_ctx)) - break; - - if (OSSL_STORE_error(store_ctx)) { - if (recursive) - ERR_clear_error(); - else - ERR_print_errors(bio_err); - ret++; - continue; - } - - BIO_printf(bio_err, - "ERROR: OSSL_STORE_load() returned NULL without " - "eof or error indications\n"); - BIO_printf(bio_err, " This is an error in the loader\n"); - ERR_print_errors(bio_err); - ret++; - break; - } - - if (type == OSSL_STORE_INFO_NAME) { - const char *name = OSSL_STORE_INFO_get0_NAME(info); - const char *desc = OSSL_STORE_INFO_get0_NAME_description(info); - indent_printf(indent, bio_out, "%d: %s: %s\n", items, infostr, - name); - if (desc != NULL) - indent_printf(indent, bio_out, "%s\n", desc); - } else { - indent_printf(indent, bio_out, "%d: %s\n", items, infostr); - } - - /* - * Unfortunately, PEM_X509_INFO_write_bio() is sorely lacking in - * functionality, so we must figure out how exactly to write things - * ourselves... - */ - switch (type) { - case OSSL_STORE_INFO_NAME: - if (recursive) { - const char *suburi = OSSL_STORE_INFO_get0_NAME(info); - ret += process(suburi, uimeth, uidata, - expected, criterion, search, - text, noout, recursive, indent + 2, out, prog); - } - break; - case OSSL_STORE_INFO_PARAMS: - if (text) - EVP_PKEY_print_params(out, OSSL_STORE_INFO_get0_PARAMS(info), - 0, NULL); - if (!noout) - PEM_write_bio_Parameters(out, - OSSL_STORE_INFO_get0_PARAMS(info)); - break; - case OSSL_STORE_INFO_PKEY: - if (text) - EVP_PKEY_print_private(out, OSSL_STORE_INFO_get0_PKEY(info), - 0, NULL); - if (!noout) - PEM_write_bio_PrivateKey(out, OSSL_STORE_INFO_get0_PKEY(info), - NULL, NULL, 0, NULL, NULL); - break; - case OSSL_STORE_INFO_CERT: - if (text) - X509_print(out, OSSL_STORE_INFO_get0_CERT(info)); - if (!noout) - PEM_write_bio_X509(out, OSSL_STORE_INFO_get0_CERT(info)); - break; - case OSSL_STORE_INFO_CRL: - if (text) - X509_CRL_print(out, OSSL_STORE_INFO_get0_CRL(info)); - if (!noout) - PEM_write_bio_X509_CRL(out, OSSL_STORE_INFO_get0_CRL(info)); - break; - default: - BIO_printf(bio_err, "!!! Unknown code\n"); - ret++; - break; - } - items++; - OSSL_STORE_INFO_free(info); - } - indent_printf(indent, out, "Total found: %d\n", items); - - end2: - if (!OSSL_STORE_close(store_ctx)) { - ERR_print_errors(bio_err); - ret++; - } - - return ret; -} diff --git a/contrib/libs/openssl/apps/testdsa.h b/contrib/libs/openssl/apps/testdsa.h deleted file mode 100644 index 3c4b459db1..0000000000 --- a/contrib/libs/openssl/apps/testdsa.h +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 1998-2017 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* used by speed.c */ -DSA *get_dsa(int); - -static unsigned char dsa512_priv[] = { - 0x65, 0xe5, 0xc7, 0x38, 0x60, 0x24, 0xb5, 0x89, 0xd4, 0x9c, 0xeb, 0x4c, - 0x9c, 0x1d, 0x7a, 0x22, 0xbd, 0xd1, 0xc2, 0xd2, -}; - -static unsigned char dsa512_pub[] = { - 0x00, 0x95, 0xa7, 0x0d, 0xec, 0x93, 0x68, 0xba, 0x5f, 0xf7, 0x5f, 0x07, - 0xf2, 0x3b, 0xad, 0x6b, 0x01, 0xdc, 0xbe, 0xec, 0xde, 0x04, 0x7a, 0x3a, - 0x27, 0xb3, 0xec, 0x49, 0xfd, 0x08, 0x43, 0x3d, 0x7e, 0xa8, 0x2c, 0x5e, - 0x7b, 0xbb, 0xfc, 0xf4, 0x6e, 0xeb, 0x6c, 0xb0, 0x6e, 0xf8, 0x02, 0x12, - 0x8c, 0x38, 0x5d, 0x83, 0x56, 0x7d, 0xee, 0x53, 0x05, 0x3e, 0x24, 0x84, - 0xbe, 0xba, 0x0a, 0x6b, 0xc8, -}; - -static unsigned char dsa512_p[] = { - 0x9D, 0x1B, 0x69, 0x8E, 0x26, 0xDB, 0xF2, 0x2B, 0x11, 0x70, 0x19, 0x86, - 0xF6, 0x19, 0xC8, 0xF8, 0x19, 0xF2, 0x18, 0x53, 0x94, 0x46, 0x06, 0xD0, - 0x62, 0x50, 0x33, 0x4B, 0x02, 0x3C, 0x52, 0x30, 0x03, 0x8B, 0x3B, 0xF9, - 0x5F, 0xD1, 0x24, 0x06, 0x4F, 0x7B, 0x4C, 0xBA, 0xAA, 0x40, 0x9B, 0xFD, - 0x96, 0xE4, 0x37, 0x33, 0xBB, 0x2D, 0x5A, 0xD7, 0x5A, 0x11, 0x40, 0x66, - 0xA2, 0x76, 0x7D, 0x31, -}; - -static unsigned char dsa512_q[] = { - 0xFB, 0x53, 0xEF, 0x50, 0xB4, 0x40, 0x92, 0x31, 0x56, 0x86, 0x53, 0x7A, - 0xE8, 0x8B, 0x22, 0x9A, 0x49, 0xFB, 0x71, 0x8F, -}; - -static unsigned char dsa512_g[] = { - 0x83, 0x3E, 0x88, 0xE5, 0xC5, 0x89, 0x73, 0xCE, 0x3B, 0x6C, 0x01, 0x49, - 0xBF, 0xB3, 0xC7, 0x9F, 0x0A, 0xEA, 0x44, 0x91, 0xE5, 0x30, 0xAA, 0xD9, - 0xBE, 0x5B, 0x5F, 0xB7, 0x10, 0xD7, 0x89, 0xB7, 0x8E, 0x74, 0xFB, 0xCF, - 0x29, 0x1E, 0xEB, 0xA8, 0x2C, 0x54, 0x51, 0xB8, 0x10, 0xDE, 0xA0, 0xCE, - 0x2F, 0xCC, 0x24, 0x6B, 0x90, 0x77, 0xDE, 0xA2, 0x68, 0xA6, 0x52, 0x12, - 0xA2, 0x03, 0x9D, 0x20, -}; - -static unsigned char dsa1024_priv[] = { - 0x7d, 0x21, 0xda, 0xbb, 0x62, 0x15, 0x47, 0x36, 0x07, 0x67, 0x12, 0xe8, - 0x8c, 0xaa, 0x1c, 0xcd, 0x38, 0x12, 0x61, 0x18, -}; - -static unsigned char dsa1024_pub[] = { - 0x3c, 0x4e, 0x9c, 0x2a, 0x7f, 0x16, 0xc1, 0x25, 0xeb, 0xac, 0x78, 0x63, - 0x90, 0x14, 0x8c, 0x8b, 0xf4, 0x68, 0x43, 0x3c, 0x2d, 0xee, 0x65, 0x50, - 0x7d, 0x9c, 0x8f, 0x8c, 0x8a, 0x51, 0xd6, 0x11, 0x2b, 0x99, 0xaf, 0x1e, - 0x90, 0x97, 0xb5, 0xd3, 0xa6, 0x20, 0x25, 0xd6, 0xfe, 0x43, 0x02, 0xd5, - 0x91, 0x7d, 0xa7, 0x8c, 0xdb, 0xc9, 0x85, 0xa3, 0x36, 0x48, 0xf7, 0x68, - 0xaa, 0x60, 0xb1, 0xf7, 0x05, 0x68, 0x3a, 0xa3, 0x3f, 0xd3, 0x19, 0x82, - 0xd8, 0x82, 0x7a, 0x77, 0xfb, 0xef, 0xf4, 0x15, 0x0a, 0xeb, 0x06, 0x04, - 0x7f, 0x53, 0x07, 0x0c, 0xbc, 0xcb, 0x2d, 0x83, 0xdb, 0x3e, 0xd1, 0x28, - 0xa5, 0xa1, 0x31, 0xe0, 0x67, 0xfa, 0x50, 0xde, 0x9b, 0x07, 0x83, 0x7e, - 0x2c, 0x0b, 0xc3, 0x13, 0x50, 0x61, 0xe5, 0xad, 0xbd, 0x36, 0xb8, 0x97, - 0x4e, 0x40, 0x7d, 0xe8, 0x83, 0x0d, 0xbc, 0x4b -}; - -static unsigned char dsa1024_p[] = { - 0xA7, 0x3F, 0x6E, 0x85, 0xBF, 0x41, 0x6A, 0x29, 0x7D, 0xF0, 0x9F, 0x47, - 0x19, 0x30, 0x90, 0x9A, 0x09, 0x1D, 0xDA, 0x6A, 0x33, 0x1E, 0xC5, 0x3D, - 0x86, 0x96, 0xB3, 0x15, 0xE0, 0x53, 0x2E, 0x8F, 0xE0, 0x59, 0x82, 0x73, - 0x90, 0x3E, 0x75, 0x31, 0x99, 0x47, 0x7A, 0x52, 0xFB, 0x85, 0xE4, 0xD9, - 0xA6, 0x7B, 0x38, 0x9B, 0x68, 0x8A, 0x84, 0x9B, 0x87, 0xC6, 0x1E, 0xB5, - 0x7E, 0x86, 0x4B, 0x53, 0x5B, 0x59, 0xCF, 0x71, 0x65, 0x19, 0x88, 0x6E, - 0xCE, 0x66, 0xAE, 0x6B, 0x88, 0x36, 0xFB, 0xEC, 0x28, 0xDC, 0xC2, 0xD7, - 0xA5, 0xBB, 0xE5, 0x2C, 0x39, 0x26, 0x4B, 0xDA, 0x9A, 0x70, 0x18, 0x95, - 0x37, 0x95, 0x10, 0x56, 0x23, 0xF6, 0x15, 0xED, 0xBA, 0x04, 0x5E, 0xDE, - 0x39, 0x4F, 0xFD, 0xB7, 0x43, 0x1F, 0xB5, 0xA4, 0x65, 0x6F, 0xCD, 0x80, - 0x11, 0xE4, 0x70, 0x95, 0x5B, 0x50, 0xCD, 0x49, -}; - -static unsigned char dsa1024_q[] = { - 0xF7, 0x07, 0x31, 0xED, 0xFA, 0x6C, 0x06, 0x03, 0xD5, 0x85, 0x8A, 0x1C, - 0xAC, 0x9C, 0x65, 0xE7, 0x50, 0x66, 0x65, 0x6F, -}; - -static unsigned char dsa1024_g[] = { - 0x4D, 0xDF, 0x4C, 0x03, 0xA6, 0x91, 0x8A, 0xF5, 0x19, 0x6F, 0x50, 0x46, - 0x25, 0x99, 0xE5, 0x68, 0x6F, 0x30, 0xE3, 0x69, 0xE1, 0xE5, 0xB3, 0x5D, - 0x98, 0xBB, 0x28, 0x86, 0x48, 0xFC, 0xDE, 0x99, 0x04, 0x3F, 0x5F, 0x88, - 0x0C, 0x9C, 0x73, 0x24, 0x0D, 0x20, 0x5D, 0xB9, 0x2A, 0x9A, 0x3F, 0x18, - 0x96, 0x27, 0xE4, 0x62, 0x87, 0xC1, 0x7B, 0x74, 0x62, 0x53, 0xFC, 0x61, - 0x27, 0xA8, 0x7A, 0x91, 0x09, 0x9D, 0xB6, 0xF1, 0x4D, 0x9C, 0x54, 0x0F, - 0x58, 0x06, 0xEE, 0x49, 0x74, 0x07, 0xCE, 0x55, 0x7E, 0x23, 0xCE, 0x16, - 0xF6, 0xCA, 0xDC, 0x5A, 0x61, 0x01, 0x7E, 0xC9, 0x71, 0xB5, 0x4D, 0xF6, - 0xDC, 0x34, 0x29, 0x87, 0x68, 0xF6, 0x5E, 0x20, 0x93, 0xB3, 0xDB, 0xF5, - 0xE4, 0x09, 0x6C, 0x41, 0x17, 0x95, 0x92, 0xEB, 0x01, 0xB5, 0x73, 0xA5, - 0x6A, 0x7E, 0xD8, 0x32, 0xED, 0x0E, 0x02, 0xB8, -}; - -static unsigned char dsa2048_priv[] = { - 0x32, 0x67, 0x92, 0xf6, 0xc4, 0xe2, 0xe2, 0xe8, 0xa0, 0x8b, 0x6b, 0x45, - 0x0c, 0x8a, 0x76, 0xb0, 0xee, 0xcf, 0x91, 0xa7, -}; - -static unsigned char dsa2048_pub[] = { - 0x17, 0x8f, 0xa8, 0x11, 0x84, 0x92, 0xec, 0x83, 0x47, 0xc7, 0x6a, 0xb0, - 0x92, 0xaf, 0x5a, 0x20, 0x37, 0xa3, 0x64, 0x79, 0xd2, 0xd0, 0x3d, 0xcd, - 0xe0, 0x61, 0x88, 0x88, 0x21, 0xcc, 0x74, 0x5d, 0xce, 0x4c, 0x51, 0x47, - 0xf0, 0xc5, 0x5c, 0x4c, 0x82, 0x7a, 0xaf, 0x72, 0xad, 0xb9, 0xe0, 0x53, - 0xf2, 0x78, 0xb7, 0xf0, 0xb5, 0x48, 0x7f, 0x8a, 0x3a, 0x18, 0xd1, 0x9f, - 0x8b, 0x7d, 0xa5, 0x47, 0xb7, 0x95, 0xab, 0x98, 0xf8, 0x7b, 0x74, 0x50, - 0x56, 0x8e, 0x57, 0xf0, 0xee, 0xf5, 0xb7, 0xba, 0xab, 0x85, 0x86, 0xf9, - 0x2b, 0xef, 0x41, 0x56, 0xa0, 0xa4, 0x9f, 0xb7, 0x38, 0x00, 0x46, 0x0a, - 0xa6, 0xf1, 0xfc, 0x1f, 0xd8, 0x4e, 0x85, 0x44, 0x92, 0x43, 0x21, 0x5d, - 0x6e, 0xcc, 0xc2, 0xcb, 0x26, 0x31, 0x0d, 0x21, 0xc4, 0xbd, 0x8d, 0x24, - 0xbc, 0xd9, 0x18, 0x19, 0xd7, 0xdc, 0xf1, 0xe7, 0x93, 0x50, 0x48, 0x03, - 0x2c, 0xae, 0x2e, 0xe7, 0x49, 0x88, 0x5f, 0x93, 0x57, 0x27, 0x99, 0x36, - 0xb4, 0x20, 0xab, 0xfc, 0xa7, 0x2b, 0xf2, 0xd9, 0x98, 0xd7, 0xd4, 0x34, - 0x9d, 0x96, 0x50, 0x58, 0x9a, 0xea, 0x54, 0xf3, 0xee, 0xf5, 0x63, 0x14, - 0xee, 0x85, 0x83, 0x74, 0x76, 0xe1, 0x52, 0x95, 0xc3, 0xf7, 0xeb, 0x04, - 0x04, 0x7b, 0xa7, 0x28, 0x1b, 0xcc, 0xea, 0x4a, 0x4e, 0x84, 0xda, 0xd8, - 0x9c, 0x79, 0xd8, 0x9b, 0x66, 0x89, 0x2f, 0xcf, 0xac, 0xd7, 0x79, 0xf9, - 0xa9, 0xd8, 0x45, 0x13, 0x78, 0xb9, 0x00, 0x14, 0xc9, 0x7e, 0x22, 0x51, - 0x86, 0x67, 0xb0, 0x9f, 0x26, 0x11, 0x23, 0xc8, 0x38, 0xd7, 0x70, 0x1d, - 0x15, 0x8e, 0x4d, 0x4f, 0x95, 0x97, 0x40, 0xa1, 0xc2, 0x7e, 0x01, 0x18, - 0x72, 0xf4, 0x10, 0xe6, 0x8d, 0x52, 0x16, 0x7f, 0xf2, 0xc9, 0xf8, 0x33, - 0x8b, 0x33, 0xb7, 0xce, -}; - -static unsigned char dsa2048_p[] = { - 0xA0, 0x25, 0xFA, 0xAD, 0xF4, 0x8E, 0xB9, 0xE5, 0x99, 0xF3, 0x5D, 0x6F, - 0x4F, 0x83, 0x34, 0xE2, 0x7E, 0xCF, 0x6F, 0xBF, 0x30, 0xAF, 0x6F, 0x81, - 0xEB, 0xF8, 0xC4, 0x13, 0xD9, 0xA0, 0x5D, 0x8B, 0x5C, 0x8E, 0xDC, 0xC2, - 0x1D, 0x0B, 0x41, 0x32, 0xB0, 0x1F, 0xFE, 0xEF, 0x0C, 0xC2, 0xA2, 0x7E, - 0x68, 0x5C, 0x28, 0x21, 0xE9, 0xF5, 0xB1, 0x58, 0x12, 0x63, 0x4C, 0x19, - 0x4E, 0xFF, 0x02, 0x4B, 0x92, 0xED, 0xD2, 0x07, 0x11, 0x4D, 0x8C, 0x58, - 0x16, 0x5C, 0x55, 0x8E, 0xAD, 0xA3, 0x67, 0x7D, 0xB9, 0x86, 0x6E, 0x0B, - 0xE6, 0x54, 0x6F, 0x40, 0xAE, 0x0E, 0x67, 0x4C, 0xF9, 0x12, 0x5B, 0x3C, - 0x08, 0x7A, 0xF7, 0xFC, 0x67, 0x86, 0x69, 0xE7, 0x0A, 0x94, 0x40, 0xBF, - 0x8B, 0x76, 0xFE, 0x26, 0xD1, 0xF2, 0xA1, 0x1A, 0x84, 0xA1, 0x43, 0x56, - 0x28, 0xBC, 0x9A, 0x5F, 0xD7, 0x3B, 0x69, 0x89, 0x8A, 0x36, 0x2C, 0x51, - 0xDF, 0x12, 0x77, 0x2F, 0x57, 0x7B, 0xA0, 0xAA, 0xDD, 0x7F, 0xA1, 0x62, - 0x3B, 0x40, 0x7B, 0x68, 0x1A, 0x8F, 0x0D, 0x38, 0xBB, 0x21, 0x5D, 0x18, - 0xFC, 0x0F, 0x46, 0xF7, 0xA3, 0xB0, 0x1D, 0x23, 0xC3, 0xD2, 0xC7, 0x72, - 0x51, 0x18, 0xDF, 0x46, 0x95, 0x79, 0xD9, 0xBD, 0xB5, 0x19, 0x02, 0x2C, - 0x87, 0xDC, 0xE7, 0x57, 0x82, 0x7E, 0xF1, 0x8B, 0x06, 0x3D, 0x00, 0xA5, - 0x7B, 0x6B, 0x26, 0x27, 0x91, 0x0F, 0x6A, 0x77, 0xE4, 0xD5, 0x04, 0xE4, - 0x12, 0x2C, 0x42, 0xFF, 0xD2, 0x88, 0xBB, 0xD3, 0x92, 0xA0, 0xF9, 0xC8, - 0x51, 0x64, 0x14, 0x5C, 0xD8, 0xF9, 0x6C, 0x47, 0x82, 0xB4, 0x1C, 0x7F, - 0x09, 0xB8, 0xF0, 0x25, 0x83, 0x1D, 0x3F, 0x3F, 0x05, 0xB3, 0x21, 0x0A, - 0x5D, 0xA7, 0xD8, 0x54, 0xC3, 0x65, 0x7D, 0xC3, 0xB0, 0x1D, 0xBF, 0xAE, - 0xF8, 0x68, 0xCF, 0x9B, -}; - -static unsigned char dsa2048_q[] = { - 0x97, 0xE7, 0x33, 0x4D, 0xD3, 0x94, 0x3E, 0x0B, 0xDB, 0x62, 0x74, 0xC6, - 0xA1, 0x08, 0xDD, 0x19, 0xA3, 0x75, 0x17, 0x1B, -}; - -static unsigned char dsa2048_g[] = { - 0x2C, 0x78, 0x16, 0x59, 0x34, 0x63, 0xF4, 0xF3, 0x92, 0xFC, 0xB5, 0xA5, - 0x4F, 0x13, 0xDE, 0x2F, 0x1C, 0xA4, 0x3C, 0xAE, 0xAD, 0x38, 0x3F, 0x7E, - 0x90, 0xBF, 0x96, 0xA6, 0xAE, 0x25, 0x90, 0x72, 0xF5, 0x8E, 0x80, 0x0C, - 0x39, 0x1C, 0xD9, 0xEC, 0xBA, 0x90, 0x5B, 0x3A, 0xE8, 0x58, 0x6C, 0x9E, - 0x30, 0x42, 0x37, 0x02, 0x31, 0x82, 0xBC, 0x6A, 0xDF, 0x6A, 0x09, 0x29, - 0xE3, 0xC0, 0x46, 0xD1, 0xCB, 0x85, 0xEC, 0x0C, 0x30, 0x5E, 0xEA, 0xC8, - 0x39, 0x8E, 0x22, 0x9F, 0x22, 0x10, 0xD2, 0x34, 0x61, 0x68, 0x37, 0x3D, - 0x2E, 0x4A, 0x5B, 0x9A, 0xF5, 0xC1, 0x48, 0xC6, 0xF6, 0xDC, 0x63, 0x1A, - 0xD3, 0x96, 0x64, 0xBA, 0x34, 0xC9, 0xD1, 0xA0, 0xD1, 0xAE, 0x6C, 0x2F, - 0x48, 0x17, 0x93, 0x14, 0x43, 0xED, 0xF0, 0x21, 0x30, 0x19, 0xC3, 0x1B, - 0x5F, 0xDE, 0xA3, 0xF0, 0x70, 0x78, 0x18, 0xE1, 0xA8, 0xE4, 0xEE, 0x2E, - 0x00, 0xA5, 0xE4, 0xB3, 0x17, 0xC8, 0x0C, 0x7D, 0x6E, 0x42, 0xDC, 0xB7, - 0x46, 0x00, 0x36, 0x4D, 0xD4, 0x46, 0xAA, 0x3D, 0x3C, 0x46, 0x89, 0x40, - 0xBF, 0x1D, 0x84, 0x77, 0x0A, 0x75, 0xF3, 0x87, 0x1D, 0x08, 0x4C, 0xA6, - 0xD1, 0xA9, 0x1C, 0x1E, 0x12, 0x1E, 0xE1, 0xC7, 0x30, 0x28, 0x76, 0xA5, - 0x7F, 0x6C, 0x85, 0x96, 0x2B, 0x6F, 0xDB, 0x80, 0x66, 0x26, 0xAE, 0xF5, - 0x93, 0xC7, 0x8E, 0xAE, 0x9A, 0xED, 0xE4, 0xCA, 0x04, 0xEA, 0x3B, 0x72, - 0xEF, 0xDC, 0x87, 0xED, 0x0D, 0xA5, 0x4C, 0x4A, 0xDD, 0x71, 0x22, 0x64, - 0x59, 0x69, 0x4E, 0x8E, 0xBF, 0x43, 0xDC, 0xAB, 0x8E, 0x66, 0xBB, 0x01, - 0xB6, 0xF4, 0xE7, 0xFD, 0xD2, 0xAD, 0x9F, 0x36, 0xC1, 0xA0, 0x29, 0x99, - 0xD1, 0x96, 0x70, 0x59, 0x06, 0x78, 0x35, 0xBD, 0x65, 0x55, 0x52, 0x9E, - 0xF8, 0xB2, 0xE5, 0x38, -}; - -typedef struct testdsa_st { - unsigned char *priv; - unsigned char *pub; - unsigned char *p; - unsigned char *g; - unsigned char *q; - int priv_l; - int pub_l; - int p_l; - int g_l; - int q_l; -} testdsa; - -#define set_dsa_ptr(st, bits) \ - do { \ - st.priv = dsa##bits##_priv; \ - st.pub = dsa##bits##_pub; \ - st.p = dsa##bits##_p; \ - st.g = dsa##bits##_g; \ - st.q = dsa##bits##_q; \ - st.priv_l = sizeof(dsa##bits##_priv); \ - st.pub_l = sizeof(dsa##bits##_pub); \ - st.p_l = sizeof(dsa##bits##_p); \ - st.g_l = sizeof(dsa##bits##_g); \ - st.q_l = sizeof(dsa##bits##_q); \ - } while (0) - -DSA *get_dsa(int dsa_bits) -{ - DSA *dsa; - BIGNUM *priv_key, *pub_key, *p, *q, *g; - testdsa dsa_t; - - switch (dsa_bits) { - case 512: - set_dsa_ptr(dsa_t, 512); - break; - case 1024: - set_dsa_ptr(dsa_t, 1024); - break; - case 2048: - set_dsa_ptr(dsa_t, 2048); - break; - default: - return NULL; - } - - if ((dsa = DSA_new()) == NULL) - return NULL; - priv_key = BN_bin2bn(dsa_t.priv, dsa_t.priv_l, NULL); - pub_key = BN_bin2bn(dsa_t.pub, dsa_t.pub_l, NULL); - p = BN_bin2bn(dsa_t.p, dsa_t.p_l, NULL); - q = BN_bin2bn(dsa_t.q, dsa_t.q_l, NULL); - g = BN_bin2bn(dsa_t.g, dsa_t.g_l, NULL); - if ((priv_key == NULL) || (pub_key == NULL) || (p == NULL) || (q == NULL) - || (g == NULL)) { - goto err; - } - if (!DSA_set0_pqg(dsa, p, q, g)) - goto err; - - if (!DSA_set0_key(dsa, pub_key, priv_key)) - goto err; - - return dsa; - err: - DSA_free(dsa); - BN_free(priv_key); - BN_free(pub_key); - BN_free(p); - BN_free(q); - BN_free(g); - return NULL; -} diff --git a/contrib/libs/openssl/apps/testrsa.h b/contrib/libs/openssl/apps/testrsa.h deleted file mode 100644 index 1350ce54e3..0000000000 --- a/contrib/libs/openssl/apps/testrsa.h +++ /dev/null @@ -1,1960 +0,0 @@ -/* - * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -static unsigned char test512[] = { - 0x30, 0x82, 0x01, 0x3a, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00, - 0xd6, 0x33, 0xb9, 0xc8, 0xfb, 0x4f, 0x3c, 0x7d, 0xc0, 0x01, - 0x86, 0xd0, 0xe7, 0xa0, 0x55, 0xf2, 0x95, 0x93, 0xcc, 0x4f, - 0xb7, 0x5b, 0x67, 0x5b, 0x94, 0x68, 0xc9, 0x34, 0x15, 0xde, - 0xa5, 0x2e, 0x1c, 0x33, 0xc2, 0x6e, 0xfc, 0x34, 0x5e, 0x71, - 0x13, 0xb7, 0xd6, 0xee, 0xd8, 0xa5, 0x65, 0x05, 0x72, 0x87, - 0xa8, 0xb0, 0x77, 0xfe, 0x57, 0xf5, 0xfc, 0x5f, 0x55, 0x83, - 0x87, 0xdd, 0x57, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, - 0x41, 0x00, 0xa7, 0xf7, 0x91, 0xc5, 0x0f, 0x84, 0x57, 0xdc, - 0x07, 0xf7, 0x6a, 0x7f, 0x60, 0x52, 0xb3, 0x72, 0xf1, 0x66, - 0x1f, 0x7d, 0x97, 0x3b, 0x9e, 0xb6, 0x0a, 0x8f, 0x8c, 0xcf, - 0x42, 0x23, 0x00, 0x04, 0xd4, 0x28, 0x0e, 0x1c, 0x90, 0xc4, - 0x11, 0x25, 0x25, 0xa5, 0x93, 0xa5, 0x2f, 0x70, 0x02, 0xdf, - 0x81, 0x9c, 0x49, 0x03, 0xa0, 0xf8, 0x6d, 0x54, 0x2e, 0x26, - 0xde, 0xaa, 0x85, 0x59, 0xa8, 0x31, 0x02, 0x21, 0x00, 0xeb, - 0x47, 0xd7, 0x3b, 0xf6, 0xc3, 0xdd, 0x5a, 0x46, 0xc5, 0xb9, - 0x2b, 0x9a, 0xa0, 0x09, 0x8f, 0xa6, 0xfb, 0xf3, 0x78, 0x7a, - 0x33, 0x70, 0x9d, 0x0f, 0x42, 0x6b, 0x13, 0x68, 0x24, 0xd3, - 0x15, 0x02, 0x21, 0x00, 0xe9, 0x10, 0xb0, 0xb3, 0x0d, 0xe2, - 0x82, 0x68, 0x77, 0x8a, 0x6e, 0x7c, 0xda, 0xbc, 0x3e, 0x53, - 0x83, 0xfb, 0xd6, 0x22, 0xe7, 0xb5, 0xae, 0x6e, 0x80, 0xda, - 0x00, 0x55, 0x97, 0xc1, 0xd0, 0x65, 0x02, 0x20, 0x4c, 0xf8, - 0x73, 0xb1, 0x6a, 0x49, 0x29, 0x61, 0x1f, 0x46, 0x10, 0x0d, - 0xf3, 0xc7, 0xe7, 0x58, 0xd7, 0x88, 0x15, 0x5e, 0x94, 0x9b, - 0xbf, 0x7b, 0xa2, 0x42, 0x58, 0x45, 0x41, 0x0c, 0xcb, 0x01, - 0x02, 0x20, 0x12, 0x11, 0xba, 0x31, 0x57, 0x9d, 0x3d, 0x11, - 0x0e, 0x5b, 0x8c, 0x2f, 0x5f, 0xe2, 0x02, 0x4f, 0x05, 0x47, - 0x8c, 0x15, 0x8e, 0xb3, 0x56, 0x3f, 0xb8, 0xfb, 0xad, 0xd4, - 0xf4, 0xfc, 0x10, 0xc5, 0x02, 0x20, 0x18, 0xa1, 0x29, 0x99, - 0x5b, 0xd9, 0xc8, 0xd4, 0xfc, 0x49, 0x7a, 0x2a, 0x21, 0x2c, - 0x49, 0xe4, 0x4f, 0xeb, 0xef, 0x51, 0xf1, 0xab, 0x6d, 0xfb, - 0x4b, 0x14, 0xe9, 0x4b, 0x52, 0xb5, 0x82, 0x2c, -}; - -static unsigned char test1024[] = { - 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, - 0x00, 0xdc, 0x98, 0x43, 0xe8, 0x3d, 0x43, 0x5b, 0xe4, 0x05, - 0xcd, 0xd0, 0xa9, 0x3e, 0xcb, 0x83, 0x75, 0xf6, 0xb5, 0xa5, - 0x9f, 0x6b, 0xe9, 0x34, 0x41, 0x29, 0x18, 0xfa, 0x6a, 0x55, - 0x4d, 0x70, 0xfc, 0xec, 0xae, 0x87, 0x38, 0x0a, 0x20, 0xa9, - 0xc0, 0x45, 0x77, 0x6e, 0x57, 0x60, 0x57, 0xf4, 0xed, 0x96, - 0x22, 0xcb, 0x8f, 0xe1, 0x33, 0x3a, 0x17, 0x1f, 0xed, 0x37, - 0xa5, 0x6f, 0xeb, 0xa6, 0xbc, 0x12, 0x80, 0x1d, 0x53, 0xbd, - 0x70, 0xeb, 0x21, 0x76, 0x3e, 0xc9, 0x2f, 0x1a, 0x45, 0x24, - 0x82, 0xff, 0xcd, 0x59, 0x32, 0x06, 0x2e, 0x12, 0x3b, 0x23, - 0x78, 0xed, 0x12, 0x3d, 0xe0, 0x8d, 0xf9, 0x67, 0x4f, 0x37, - 0x4e, 0x47, 0x02, 0x4c, 0x2d, 0xc0, 0x4f, 0x1f, 0xb3, 0x94, - 0xe1, 0x41, 0x2e, 0x2d, 0x90, 0x10, 0xfc, 0x82, 0x91, 0x8b, - 0x0f, 0x22, 0xd4, 0xf2, 0xfc, 0x2c, 0xab, 0x53, 0x55, 0x02, - 0x03, 0x01, 0x00, 0x01, 0x02, 0x81, 0x80, 0x2b, 0xcc, 0x3f, - 0x8f, 0x58, 0xba, 0x8b, 0x00, 0x16, 0xf6, 0xea, 0x3a, 0xf0, - 0x30, 0xd0, 0x05, 0x17, 0xda, 0xb0, 0xeb, 0x9a, 0x2d, 0x4f, - 0x26, 0xb0, 0xd6, 0x38, 0xc1, 0xeb, 0xf5, 0xd8, 0x3d, 0x1f, - 0x70, 0xf7, 0x7f, 0xf4, 0xe2, 0xcf, 0x51, 0x51, 0x79, 0x88, - 0xfa, 0xe8, 0x32, 0x0e, 0x7b, 0x2d, 0x97, 0xf2, 0xfa, 0xba, - 0x27, 0xc5, 0x9c, 0xd9, 0xc5, 0xeb, 0x8a, 0x79, 0x52, 0x3c, - 0x64, 0x34, 0x7d, 0xc2, 0xcf, 0x28, 0xc7, 0x4e, 0xd5, 0x43, - 0x0b, 0xd1, 0xa6, 0xca, 0x6d, 0x03, 0x2d, 0x72, 0x23, 0xbc, - 0x6d, 0x05, 0xfa, 0x16, 0x09, 0x2f, 0x2e, 0x5c, 0xb6, 0xee, - 0x74, 0xdd, 0xd2, 0x48, 0x8e, 0x36, 0x0c, 0x06, 0x3d, 0x4d, - 0xe5, 0x10, 0x82, 0xeb, 0x6a, 0xf3, 0x4b, 0x9f, 0xd6, 0xed, - 0x11, 0xb1, 0x6e, 0xec, 0xf4, 0xfe, 0x8e, 0x75, 0x94, 0x20, - 0x2f, 0xcb, 0xac, 0x46, 0xf1, 0x02, 0x41, 0x00, 0xf9, 0x8c, - 0xa3, 0x85, 0xb1, 0xdd, 0x29, 0xaf, 0x65, 0xc1, 0x33, 0xf3, - 0x95, 0xc5, 0x52, 0x68, 0x0b, 0xd4, 0xf1, 0xe5, 0x0e, 0x02, - 0x9f, 0x4f, 0xfa, 0x77, 0xdc, 0x46, 0x9e, 0xc7, 0xa6, 0xe4, - 0x16, 0x29, 0xda, 0xb0, 0x07, 0xcf, 0x5b, 0xa9, 0x12, 0x8a, - 0xdd, 0x63, 0x0a, 0xde, 0x2e, 0x8c, 0x66, 0x8b, 0x8c, 0xdc, - 0x19, 0xa3, 0x7e, 0xf4, 0x3b, 0xd0, 0x1a, 0x8c, 0xa4, 0xc2, - 0xe1, 0xd3, 0x02, 0x41, 0x00, 0xe2, 0x4c, 0x05, 0xf2, 0x04, - 0x86, 0x4e, 0x61, 0x43, 0xdb, 0xb0, 0xb9, 0x96, 0x86, 0x52, - 0x2c, 0xca, 0x8d, 0x7b, 0xab, 0x0b, 0x13, 0x0d, 0x7e, 0x38, - 0x5b, 0xe2, 0x2e, 0x7b, 0x0e, 0xe7, 0x19, 0x99, 0x38, 0xe7, - 0xf2, 0x21, 0xbd, 0x85, 0x85, 0xe3, 0xfd, 0x28, 0x77, 0x20, - 0x31, 0x71, 0x2c, 0xd0, 0xff, 0xfb, 0x2e, 0xaf, 0x85, 0xb4, - 0x86, 0xca, 0xf3, 0xbb, 0xca, 0xaa, 0x0f, 0x95, 0x37, 0x02, - 0x40, 0x0e, 0x41, 0x9a, 0x95, 0xe8, 0xb3, 0x59, 0xce, 0x4b, - 0x61, 0xde, 0x35, 0xec, 0x38, 0x79, 0x9c, 0xb8, 0x10, 0x52, - 0x41, 0x63, 0xab, 0x82, 0xae, 0x6f, 0x00, 0xa9, 0xf4, 0xde, - 0xdd, 0x49, 0x0b, 0x7e, 0xb8, 0xa5, 0x65, 0xa9, 0x0c, 0x8f, - 0x8f, 0xf9, 0x1f, 0x35, 0xc6, 0x92, 0xb8, 0x5e, 0xb0, 0x66, - 0xab, 0x52, 0x40, 0xc0, 0xb6, 0x36, 0x6a, 0x7d, 0x80, 0x46, - 0x04, 0x02, 0xe5, 0x9f, 0x41, 0x02, 0x41, 0x00, 0xc0, 0xad, - 0xcc, 0x4e, 0x21, 0xee, 0x1d, 0x24, 0x91, 0xfb, 0xa7, 0x80, - 0x8d, 0x9a, 0xb6, 0xb3, 0x2e, 0x8f, 0xc2, 0xe1, 0x82, 0xdf, - 0x69, 0x18, 0xb4, 0x71, 0xff, 0xa6, 0x65, 0xde, 0xed, 0x84, - 0x8d, 0x42, 0xb7, 0xb3, 0x21, 0x69, 0x56, 0x1c, 0x07, 0x60, - 0x51, 0x29, 0x04, 0xff, 0x34, 0x06, 0xdd, 0xb9, 0x67, 0x2c, - 0x7c, 0x04, 0x93, 0x0e, 0x46, 0x15, 0xbb, 0x2a, 0xb7, 0x1b, - 0xe7, 0x87, 0x02, 0x40, 0x78, 0xda, 0x5d, 0x07, 0x51, 0x0c, - 0x16, 0x7a, 0x9f, 0x29, 0x20, 0x84, 0x0d, 0x42, 0xfa, 0xd7, - 0x00, 0xd8, 0x77, 0x7e, 0xb0, 0xb0, 0x6b, 0xd6, 0x5b, 0x53, - 0xb8, 0x9b, 0x7a, 0xcd, 0xc7, 0x2b, 0xb8, 0x6a, 0x63, 0xa9, - 0xfb, 0x6f, 0xa4, 0x72, 0xbf, 0x4c, 0x5d, 0x00, 0x14, 0xba, - 0xfa, 0x59, 0x88, 0xed, 0xe4, 0xe0, 0x8c, 0xa2, 0xec, 0x14, - 0x7e, 0x2d, 0xe2, 0xf0, 0x46, 0x49, 0x95, 0x45, -}; - -static unsigned char test2048[] = { - 0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xc0, 0xc0, 0xce, 0x3e, 0x3c, 0x53, 0x67, 0x3f, - 0x4f, 0xc5, 0x2f, 0xa4, 0xc2, 0x5a, 0x2f, 0x58, 0xfd, 0x27, - 0x52, 0x6a, 0xe8, 0xcf, 0x4a, 0x73, 0x47, 0x8d, 0x25, 0x0f, - 0x5f, 0x03, 0x26, 0x78, 0xef, 0xf0, 0x22, 0x12, 0xd3, 0xde, - 0x47, 0xb2, 0x1c, 0x0b, 0x38, 0x63, 0x1a, 0x6c, 0x85, 0x7a, - 0x80, 0xc6, 0x8f, 0xa0, 0x41, 0xaf, 0x62, 0xc4, 0x67, 0x32, - 0x88, 0xf8, 0xa6, 0x9c, 0xf5, 0x23, 0x1d, 0xe4, 0xac, 0x3f, - 0x29, 0xf9, 0xec, 0xe1, 0x8b, 0x26, 0x03, 0x2c, 0xb2, 0xab, - 0xf3, 0x7d, 0xb5, 0xca, 0x49, 0xc0, 0x8f, 0x1c, 0xdf, 0x33, - 0x3a, 0x60, 0xda, 0x3c, 0xb0, 0x16, 0xf8, 0xa9, 0x12, 0x8f, - 0x64, 0xac, 0x23, 0x0c, 0x69, 0x64, 0x97, 0x5d, 0x99, 0xd4, - 0x09, 0x83, 0x9b, 0x61, 0xd3, 0xac, 0xf0, 0xde, 0xdd, 0x5e, - 0x9f, 0x44, 0x94, 0xdb, 0x3a, 0x4d, 0x97, 0xe8, 0x52, 0x29, - 0xf7, 0xdb, 0x94, 0x07, 0x45, 0x90, 0x78, 0x1e, 0x31, 0x0b, - 0x80, 0xf7, 0x57, 0xad, 0x1c, 0x79, 0xc5, 0xcb, 0x32, 0xb0, - 0xce, 0xcd, 0x74, 0xb3, 0xe2, 0x94, 0xc5, 0x78, 0x2f, 0x34, - 0x1a, 0x45, 0xf7, 0x8c, 0x52, 0xa5, 0xbc, 0x8d, 0xec, 0xd1, - 0x2f, 0x31, 0x3b, 0xf0, 0x49, 0x59, 0x5e, 0x88, 0x9d, 0x15, - 0x92, 0x35, 0x32, 0xc1, 0xe7, 0x61, 0xec, 0x50, 0x48, 0x7c, - 0xba, 0x05, 0xf9, 0xf8, 0xf8, 0xa7, 0x8c, 0x83, 0xe8, 0x66, - 0x5b, 0xeb, 0xfe, 0xd8, 0x4f, 0xdd, 0x6d, 0x36, 0xc0, 0xb2, - 0x90, 0x0f, 0xb8, 0x52, 0xf9, 0x04, 0x9b, 0x40, 0x2c, 0x27, - 0xd6, 0x36, 0x8e, 0xc2, 0x1b, 0x44, 0xf3, 0x92, 0xd5, 0x15, - 0x9e, 0x9a, 0xbc, 0xf3, 0x7d, 0x03, 0xd7, 0x02, 0x14, 0x20, - 0xe9, 0x10, 0x92, 0xfd, 0xf9, 0xfc, 0x8f, 0xe5, 0x18, 0xe1, - 0x95, 0xcc, 0x9e, 0x60, 0xa6, 0xfa, 0x38, 0x4d, 0x02, 0x03, - 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x00, 0xc3, 0xc3, - 0x0d, 0xb4, 0x27, 0x90, 0x8d, 0x4b, 0xbf, 0xb8, 0x84, 0xaa, - 0xd0, 0xb8, 0xc7, 0x5d, 0x99, 0xbe, 0x55, 0xf6, 0x3e, 0x7c, - 0x49, 0x20, 0xcb, 0x8a, 0x8e, 0x19, 0x0e, 0x66, 0x24, 0xac, - 0xaf, 0x03, 0x33, 0x97, 0xeb, 0x95, 0xd5, 0x3b, 0x0f, 0x40, - 0x56, 0x04, 0x50, 0xd1, 0xe6, 0xbe, 0x84, 0x0b, 0x25, 0xd3, - 0x9c, 0xe2, 0x83, 0x6c, 0xf5, 0x62, 0x5d, 0xba, 0x2b, 0x7d, - 0x3d, 0x7a, 0x6c, 0xe1, 0xd2, 0x0e, 0x54, 0x93, 0x80, 0x01, - 0x91, 0x51, 0x09, 0xe8, 0x5b, 0x8e, 0x47, 0xbd, 0x64, 0xe4, - 0x0e, 0x03, 0x83, 0x55, 0xcf, 0x5a, 0x37, 0xf0, 0x25, 0xb5, - 0x7d, 0x21, 0xd7, 0x69, 0xdf, 0x6f, 0xc2, 0xcf, 0x10, 0xc9, - 0x8a, 0x40, 0x9f, 0x7a, 0x70, 0xc0, 0xe8, 0xe8, 0xc0, 0xe6, - 0x9a, 0x15, 0x0a, 0x8d, 0x4e, 0x46, 0xcb, 0x7a, 0xdb, 0xb3, - 0xcb, 0x83, 0x02, 0xc4, 0xf0, 0xab, 0xeb, 0x02, 0x01, 0x0e, - 0x23, 0xfc, 0x1d, 0xc4, 0xbd, 0xd4, 0xaa, 0x5d, 0x31, 0x46, - 0x99, 0xce, 0x9e, 0xf8, 0x04, 0x75, 0x10, 0x67, 0xc4, 0x53, - 0x47, 0x44, 0xfa, 0xc2, 0x25, 0x73, 0x7e, 0xd0, 0x8e, 0x59, - 0xd1, 0xb2, 0x5a, 0xf4, 0xc7, 0x18, 0x92, 0x2f, 0x39, 0xab, - 0xcd, 0xa3, 0xb5, 0xc2, 0xb9, 0xc7, 0xb9, 0x1b, 0x9f, 0x48, - 0xfa, 0x13, 0xc6, 0x98, 0x4d, 0xca, 0x84, 0x9c, 0x06, 0xca, - 0xe7, 0x89, 0x01, 0x04, 0xc4, 0x6c, 0xfd, 0x29, 0x59, 0x35, - 0xe7, 0xf3, 0xdd, 0xce, 0x64, 0x59, 0xbf, 0x21, 0x13, 0xa9, - 0x9f, 0x0e, 0xc5, 0xff, 0xbd, 0x33, 0x00, 0xec, 0xac, 0x6b, - 0x11, 0xef, 0x51, 0x5e, 0xad, 0x07, 0x15, 0xde, 0xb8, 0x5f, - 0xc6, 0xb9, 0xa3, 0x22, 0x65, 0x46, 0x83, 0x14, 0xdf, 0xd0, - 0xf1, 0x44, 0x8a, 0xe1, 0x9c, 0x23, 0x33, 0xb4, 0x97, 0x33, - 0xe6, 0x6b, 0x81, 0x02, 0x81, 0x81, 0x00, 0xec, 0x12, 0xa7, - 0x59, 0x74, 0x6a, 0xde, 0x3e, 0xad, 0xd8, 0x36, 0x80, 0x50, - 0xa2, 0xd5, 0x21, 0x81, 0x07, 0xf1, 0xd0, 0x91, 0xf2, 0x6c, - 0x12, 0x2f, 0x9d, 0x1a, 0x26, 0xf8, 0x30, 0x65, 0xdf, 0xe8, - 0xc0, 0x9b, 0x6a, 0x30, 0x98, 0x82, 0x87, 0xec, 0xa2, 0x56, - 0x87, 0x62, 0x6f, 0xe7, 0x9f, 0xf6, 0x56, 0xe6, 0x71, 0x8f, - 0x49, 0x86, 0x93, 0x5a, 0x4d, 0x34, 0x58, 0xfe, 0xd9, 0x04, - 0x13, 0xaf, 0x79, 0xb7, 0xad, 0x11, 0xd1, 0x30, 0x9a, 0x14, - 0x06, 0xa0, 0xfa, 0xb7, 0x55, 0xdc, 0x6c, 0x5a, 0x4c, 0x2c, - 0x59, 0x56, 0xf6, 0xe8, 0x9d, 0xaf, 0x0a, 0x78, 0x99, 0x06, - 0x06, 0x9e, 0xe7, 0x9c, 0x51, 0x55, 0x43, 0xfc, 0x3b, 0x6c, - 0x0b, 0xbf, 0x2d, 0x41, 0xa7, 0xaf, 0xb7, 0xe0, 0xe8, 0x28, - 0x18, 0xb4, 0x13, 0xd1, 0xe6, 0x97, 0xd0, 0x9f, 0x6a, 0x80, - 0xca, 0xdd, 0x1a, 0x7e, 0x15, 0x02, 0x81, 0x81, 0x00, 0xd1, - 0x06, 0x0c, 0x1f, 0xe3, 0xd0, 0xab, 0xd6, 0xca, 0x7c, 0xbc, - 0x7d, 0x13, 0x35, 0xce, 0x27, 0xcd, 0xd8, 0x49, 0x51, 0x63, - 0x64, 0x0f, 0xca, 0x06, 0x12, 0xfc, 0x07, 0x3e, 0xaf, 0x61, - 0x6d, 0xe2, 0x53, 0x39, 0x27, 0xae, 0xc3, 0x11, 0x9e, 0x94, - 0x01, 0x4f, 0xe3, 0xf3, 0x67, 0xf9, 0x77, 0xf9, 0xe7, 0x95, - 0x3a, 0x6f, 0xe2, 0x20, 0x73, 0x3e, 0xa4, 0x7a, 0x28, 0xd4, - 0x61, 0x97, 0xf6, 0x17, 0xa0, 0x23, 0x10, 0x2b, 0xce, 0x84, - 0x57, 0x7e, 0x25, 0x1f, 0xf4, 0xa8, 0x54, 0xd2, 0x65, 0x94, - 0xcc, 0x95, 0x0a, 0xab, 0x30, 0xc1, 0x59, 0x1f, 0x61, 0x8e, - 0xb9, 0x6b, 0xd7, 0x4e, 0xb9, 0x83, 0x43, 0x79, 0x85, 0x11, - 0xbc, 0x0f, 0xae, 0x25, 0x20, 0x05, 0xbc, 0xd2, 0x48, 0xa1, - 0x68, 0x09, 0x84, 0xf6, 0x12, 0x9a, 0x66, 0xb9, 0x2b, 0xbb, - 0x76, 0x03, 0x17, 0x46, 0x4e, 0x97, 0x59, 0x02, 0x81, 0x80, - 0x09, 0x4c, 0xfa, 0xd6, 0xe5, 0x65, 0x48, 0x78, 0x43, 0xb5, - 0x1f, 0x00, 0x93, 0x2c, 0xb7, 0x24, 0xe8, 0xc6, 0x7d, 0x5a, - 0x70, 0x45, 0x92, 0xc8, 0x6c, 0xa3, 0xcd, 0xe1, 0xf7, 0x29, - 0x40, 0xfa, 0x3f, 0x5b, 0x47, 0x44, 0x39, 0xc1, 0xe8, 0x72, - 0x9e, 0x7a, 0x0e, 0xda, 0xaa, 0xa0, 0x2a, 0x09, 0xfd, 0x54, - 0x93, 0x23, 0xaa, 0x37, 0x85, 0x5b, 0xcc, 0xd4, 0xf9, 0xd8, - 0xff, 0xc1, 0x61, 0x0d, 0xbd, 0x7e, 0x18, 0x24, 0x73, 0x6d, - 0x40, 0x72, 0xf1, 0x93, 0x09, 0x48, 0x97, 0x6c, 0x84, 0x90, - 0xa8, 0x46, 0x14, 0x01, 0x39, 0x11, 0xe5, 0x3c, 0x41, 0x27, - 0x32, 0x75, 0x24, 0xed, 0xa1, 0xd9, 0x12, 0x29, 0x8a, 0x28, - 0x71, 0x89, 0x8d, 0xca, 0x30, 0xb0, 0x01, 0xc4, 0x2f, 0x82, - 0x19, 0x14, 0x4c, 0x70, 0x1c, 0xb8, 0x23, 0x2e, 0xe8, 0x90, - 0x49, 0x97, 0x92, 0x97, 0x6b, 0x7a, 0x9d, 0xb9, 0x02, 0x81, - 0x80, 0x0f, 0x0e, 0xa1, 0x76, 0xf6, 0xa1, 0x44, 0x8f, 0xaf, - 0x7c, 0x76, 0xd3, 0x87, 0xbb, 0xbb, 0x83, 0x10, 0x88, 0x01, - 0x18, 0x14, 0xd1, 0xd3, 0x75, 0x59, 0x24, 0xaa, 0xf5, 0x16, - 0xa5, 0xe9, 0x9d, 0xd1, 0xcc, 0xee, 0xf4, 0x15, 0xd9, 0xc5, - 0x7e, 0x27, 0xe9, 0x44, 0x49, 0x06, 0x72, 0xb9, 0xfc, 0xd3, - 0x8a, 0xc4, 0x2c, 0x36, 0x7d, 0x12, 0x9b, 0x5a, 0xaa, 0xdc, - 0x85, 0xee, 0x6e, 0xad, 0x54, 0xb3, 0xf4, 0xfc, 0x31, 0xa1, - 0x06, 0x3a, 0x70, 0x57, 0x0c, 0xf3, 0x95, 0x5b, 0x3e, 0xe8, - 0xfd, 0x1a, 0x4f, 0xf6, 0x78, 0x93, 0x46, 0x6a, 0xd7, 0x31, - 0xb4, 0x84, 0x64, 0x85, 0x09, 0x38, 0x89, 0x92, 0x94, 0x1c, - 0xbf, 0xe2, 0x3c, 0x2a, 0xe0, 0xff, 0x99, 0xa3, 0xf0, 0x2b, - 0x31, 0xc2, 0x36, 0xcd, 0x60, 0xbf, 0x9d, 0x2d, 0x74, 0x32, - 0xe8, 0x9c, 0x93, 0x6e, 0xbb, 0x91, 0x7b, 0xfd, 0xd9, 0x02, - 0x81, 0x81, 0x00, 0xa2, 0x71, 0x25, 0x38, 0xeb, 0x2a, 0xe9, - 0x37, 0xcd, 0xfe, 0x44, 0xce, 0x90, 0x3f, 0x52, 0x87, 0x84, - 0x52, 0x1b, 0xae, 0x8d, 0x22, 0x94, 0xce, 0x38, 0xe6, 0x04, - 0x88, 0x76, 0x85, 0x9a, 0xd3, 0x14, 0x09, 0xe5, 0x69, 0x9a, - 0xff, 0x58, 0x92, 0x02, 0x6a, 0x7d, 0x7c, 0x1e, 0x2c, 0xfd, - 0xa8, 0xca, 0x32, 0x14, 0x4f, 0x0d, 0x84, 0x0d, 0x37, 0x43, - 0xbf, 0xe4, 0x5d, 0x12, 0xc8, 0x24, 0x91, 0x27, 0x8d, 0x46, - 0xd9, 0x54, 0x53, 0xe7, 0x62, 0x71, 0xa8, 0x2b, 0x71, 0x41, - 0x8d, 0x75, 0xf8, 0x3a, 0xa0, 0x61, 0x29, 0x46, 0xa6, 0xe5, - 0x82, 0xfa, 0x3a, 0xd9, 0x08, 0xfa, 0xfc, 0x63, 0xfd, 0x6b, - 0x30, 0xbc, 0xf4, 0x4e, 0x9e, 0x8c, 0x25, 0x0c, 0xb6, 0x55, - 0xe7, 0x3c, 0xd4, 0x4e, 0x0b, 0xfd, 0x8b, 0xc3, 0x0e, 0x1d, - 0x9c, 0x44, 0x57, 0x8f, 0x1f, 0x86, 0xf7, 0xd5, 0x1b, 0xe4, - 0x95, -}; - -static unsigned char test3072[] = { - 0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, - 0x81, 0x00, 0xbc, 0x3b, 0x23, 0xc0, 0x33, 0xa7, 0x8b, 0xaa, - 0xca, 0xa3, 0x8c, 0x94, 0xf2, 0x4c, 0x52, 0x08, 0x85, 0x80, - 0xfc, 0x36, 0x15, 0xfa, 0x03, 0x06, 0xb6, 0xd6, 0x3f, 0x60, - 0x8a, 0x89, 0x0d, 0xba, 0x1a, 0x51, 0x0b, 0x12, 0xea, 0x71, - 0x77, 0xf6, 0x3a, 0x30, 0x21, 0x3d, 0x24, 0xf8, 0x2e, 0xd0, - 0x17, 0x3a, 0x85, 0x94, 0x25, 0x42, 0x89, 0xff, 0x6a, 0x68, - 0xdf, 0x1f, 0x86, 0xae, 0xa5, 0xbb, 0x9a, 0x79, 0xf6, 0x69, - 0x94, 0xfe, 0xde, 0xfe, 0xce, 0x1b, 0x2e, 0xae, 0x1d, 0x91, - 0xcb, 0xb9, 0xf1, 0x2d, 0xd8, 0x00, 0x82, 0x51, 0x8e, 0xf9, - 0xfd, 0xac, 0xf1, 0x0e, 0x7f, 0xb7, 0x95, 0x85, 0x35, 0xf9, - 0xcb, 0xbe, 0x5f, 0xd3, 0x58, 0xe3, 0xa1, 0x54, 0x9e, 0x30, - 0xb1, 0x8d, 0x01, 0x97, 0x82, 0x06, 0x8e, 0x77, 0xfb, 0xce, - 0x50, 0x2f, 0xbf, 0xf1, 0xff, 0x57, 0x0a, 0x42, 0x03, 0xfd, - 0x0e, 0xba, 0x1e, 0xca, 0x85, 0xc1, 0x9b, 0xa5, 0x9d, 0x09, - 0x0e, 0xe9, 0xbb, 0xc5, 0x73, 0x47, 0x0d, 0x39, 0x3c, 0x64, - 0x06, 0x9a, 0x79, 0x3f, 0x50, 0x87, 0x9c, 0x18, 0x2d, 0x62, - 0x01, 0xfc, 0xed, 0xc1, 0x58, 0x28, 0x21, 0x94, 0x1e, 0xf9, - 0x2d, 0x96, 0x4f, 0xd0, 0xbc, 0xf1, 0xe0, 0x8a, 0xfa, 0x4d, - 0xb6, 0x78, 0x4a, 0xde, 0x17, 0x59, 0xb0, 0x22, 0xa0, 0x9a, - 0xd3, 0x70, 0xb6, 0xc2, 0xbe, 0xbc, 0x96, 0xca, 0x41, 0x5f, - 0x58, 0x4e, 0xce, 0xef, 0x64, 0x45, 0xdd, 0x3f, 0x81, 0x92, - 0xcc, 0x40, 0x79, 0xfc, 0x19, 0xe2, 0xbc, 0x77, 0x2f, 0x43, - 0xfb, 0x8e, 0xad, 0x82, 0x4a, 0x0b, 0xb1, 0xbc, 0x09, 0x8a, - 0x80, 0xc3, 0x0f, 0xef, 0xd2, 0x06, 0xd3, 0x4b, 0x0c, 0x7f, - 0xae, 0x60, 0x3f, 0x2e, 0x52, 0xb4, 0xe4, 0xc2, 0x5c, 0xa6, - 0x71, 0xc0, 0x13, 0x9c, 0xca, 0xa6, 0x0d, 0x13, 0xd7, 0xb7, - 0x14, 0x94, 0x3f, 0x0d, 0x8b, 0x06, 0x70, 0x2f, 0x15, 0x82, - 0x8d, 0x47, 0x45, 0xa6, 0x00, 0x8a, 0x14, 0x91, 0xde, 0x2f, - 0x50, 0x17, 0xe3, 0x1d, 0x34, 0x29, 0x8c, 0xe4, 0x57, 0x74, - 0x2a, 0x3a, 0x82, 0x65, 0x26, 0xf7, 0x8d, 0xcc, 0x1b, 0x8f, - 0xaf, 0xe5, 0x85, 0xe5, 0xbe, 0x85, 0xd6, 0xb7, 0x04, 0xe8, - 0xf5, 0xd4, 0x74, 0xe2, 0x54, 0x14, 0xdd, 0x58, 0xcf, 0x1f, - 0x11, 0x8a, 0x9f, 0x82, 0xa2, 0x01, 0xf9, 0xc2, 0xdf, 0x7b, - 0x84, 0xb1, 0xd8, 0x5b, 0x70, 0xbb, 0x24, 0xe7, 0xd0, 0x2a, - 0x75, 0x3d, 0x55, 0xac, 0x45, 0xe9, 0xab, 0xc6, 0x84, 0x8a, - 0xe7, 0x6d, 0x26, 0x12, 0x89, 0xb5, 0x67, 0xe8, 0x46, 0x9d, - 0x46, 0x1a, 0xfa, 0x2d, 0xc0, 0x5b, 0x60, 0x46, 0x8b, 0xb7, - 0x32, 0x03, 0xff, 0x75, 0xee, 0x9f, 0x3c, 0xdd, 0xb6, 0x35, - 0x4e, 0x82, 0xbd, 0x99, 0x73, 0x51, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x80, 0x42, 0xee, 0xa4, 0x9f, 0xcb, - 0xbe, 0x60, 0x23, 0xb3, 0x3a, 0xc4, 0xda, 0x91, 0xee, 0x21, - 0x9d, 0x76, 0x1b, 0x8f, 0x93, 0x8b, 0xed, 0x02, 0xf6, 0x78, - 0x3d, 0x66, 0xfb, 0xe5, 0x47, 0x26, 0xe2, 0x6e, 0x49, 0x33, - 0x2e, 0xde, 0xbe, 0xca, 0x71, 0x7b, 0xef, 0x71, 0x62, 0x54, - 0xab, 0x0b, 0xba, 0x63, 0x08, 0x24, 0x47, 0xb1, 0x98, 0x1f, - 0x89, 0xfb, 0x44, 0x9f, 0x52, 0x8e, 0x89, 0xbb, 0xd5, 0x21, - 0xf1, 0x0c, 0x76, 0x2e, 0xcd, 0x12, 0x6e, 0x78, 0xcb, 0xa1, - 0xa5, 0xb8, 0x4e, 0x07, 0xab, 0x6e, 0xdf, 0x66, 0x57, 0x87, - 0xff, 0x88, 0x5f, 0xcc, 0x9c, 0x9a, 0x7b, 0x15, 0x5f, 0x2a, - 0x83, 0xdb, 0xd5, 0x9f, 0x65, 0x6a, 0x9d, 0xb4, 0x95, 0xfc, - 0xe0, 0x22, 0x00, 0x1e, 0xa2, 0x8d, 0x56, 0x5a, 0x9e, 0x0a, - 0x3b, 0x10, 0x07, 0x24, 0xec, 0x55, 0xcc, 0xaf, 0x87, 0x3b, - 0xd6, 0x8d, 0xa4, 0x86, 0x80, 0x18, 0x42, 0xdb, 0x9d, 0x24, - 0xc3, 0x97, 0x3b, 0x89, 0x5a, 0x03, 0xb3, 0x0a, 0x72, 0xd1, - 0x78, 0xf0, 0xc8, 0x80, 0xb0, 0x9d, 0x3c, 0xae, 0x5e, 0x0a, - 0x5b, 0x6e, 0x87, 0xd3, 0x3d, 0x25, 0x2e, 0x03, 0x33, 0x01, - 0xfd, 0xb1, 0xa5, 0xd9, 0x58, 0x01, 0xb9, 0xaf, 0xf6, 0x32, - 0x6a, 0x38, 0xe7, 0x39, 0x63, 0x3c, 0xfc, 0x0c, 0x41, 0x90, - 0x28, 0x40, 0x03, 0xcd, 0xfb, 0xde, 0x80, 0x74, 0x21, 0xaa, - 0xae, 0x58, 0xe9, 0x97, 0x18, 0x85, 0x58, 0x3d, 0x2b, 0xd6, - 0x61, 0xf6, 0xe8, 0xbc, 0x6d, 0x2a, 0xf3, 0xb8, 0xea, 0x8c, - 0x64, 0x44, 0xc6, 0xd3, 0x9f, 0x00, 0x7b, 0xb2, 0x52, 0x18, - 0x11, 0x04, 0x96, 0xb7, 0x05, 0xbb, 0xc2, 0x38, 0x5b, 0xa7, - 0x0a, 0x84, 0xb6, 0x4f, 0x02, 0x63, 0xa4, 0x57, 0x00, 0xe3, - 0xde, 0xe4, 0xf2, 0xb3, 0x55, 0xd9, 0x00, 0xa9, 0xd2, 0x5c, - 0x69, 0x9f, 0xe5, 0x80, 0x4f, 0x23, 0x7c, 0xd9, 0xa7, 0x77, - 0x4a, 0xbb, 0x09, 0x6d, 0x45, 0x02, 0xcf, 0x32, 0x90, 0xfd, - 0x10, 0xb6, 0xb3, 0x93, 0xd9, 0x3b, 0x1d, 0x57, 0x66, 0xb5, - 0xb3, 0xb1, 0x6e, 0x53, 0x5f, 0x04, 0x60, 0x29, 0xcd, 0xe8, - 0xb8, 0xab, 0x62, 0x82, 0x33, 0x40, 0xc7, 0xf8, 0x64, 0x60, - 0x0e, 0xab, 0x06, 0x3e, 0xa0, 0xa3, 0x62, 0x11, 0x3f, 0x67, - 0x5d, 0x24, 0x9e, 0x60, 0x29, 0xdc, 0x4c, 0xd5, 0x13, 0xee, - 0x3d, 0xb7, 0x84, 0x93, 0x27, 0xb5, 0x6a, 0xf9, 0xf0, 0xdd, - 0x50, 0xac, 0x46, 0x3c, 0xe6, 0xd5, 0xec, 0xf7, 0xb7, 0x9f, - 0x23, 0x39, 0x9c, 0x88, 0x8c, 0x5a, 0x62, 0x3f, 0x8d, 0x4a, - 0xd7, 0xeb, 0x5e, 0x1e, 0x49, 0xf8, 0xa9, 0x53, 0x11, 0x75, - 0xd0, 0x43, 0x1e, 0xc7, 0x29, 0x22, 0x80, 0x1f, 0xc5, 0x83, - 0x8d, 0x20, 0x04, 0x87, 0x7f, 0x57, 0x8c, 0xf5, 0xa1, 0x02, - 0x81, 0xc1, 0x00, 0xf7, 0xaa, 0xf5, 0xa5, 0x00, 0xdb, 0xd6, - 0x11, 0xfc, 0x07, 0x6d, 0x22, 0x24, 0x2b, 0x4b, 0xc5, 0x67, - 0x0f, 0x37, 0xa5, 0xdb, 0x8f, 0x38, 0xe2, 0x05, 0x43, 0x9a, - 0x44, 0x05, 0x3f, 0xa9, 0xac, 0x4c, 0x98, 0x3c, 0x72, 0x38, - 0xc3, 0x89, 0x33, 0x58, 0x73, 0x51, 0xcc, 0x5d, 0x2f, 0x8f, - 0x6d, 0x3f, 0xa1, 0x22, 0x9e, 0xfb, 0x9a, 0xb4, 0xb8, 0x79, - 0x95, 0xaf, 0x83, 0xcf, 0x5a, 0xb7, 0x14, 0x14, 0x0c, 0x51, - 0x8a, 0x11, 0xe6, 0xd6, 0x21, 0x1e, 0x17, 0x13, 0xd3, 0x69, - 0x7a, 0x3a, 0xd5, 0xaf, 0x3f, 0xb8, 0x25, 0x01, 0xcb, 0x2b, - 0xe6, 0xfc, 0x03, 0xd8, 0xd4, 0xf7, 0x20, 0xe0, 0x21, 0xef, - 0x1a, 0xca, 0x61, 0xeb, 0x8e, 0x96, 0x45, 0x8e, 0x5c, 0xe6, - 0x81, 0x0b, 0x2d, 0x05, 0x32, 0xf9, 0x41, 0x62, 0xb4, 0x33, - 0x98, 0x10, 0x3a, 0xcd, 0xf0, 0x7a, 0x8b, 0x1a, 0x48, 0xd7, - 0x3b, 0x01, 0xf5, 0x18, 0x65, 0x8f, 0x3c, 0xc2, 0x31, 0x3b, - 0xd3, 0xa7, 0x17, 0x5f, 0x7c, 0x0c, 0xe7, 0x25, 0x18, 0x5a, - 0x08, 0xe1, 0x09, 0x89, 0x13, 0xa7, 0xc5, 0x12, 0xab, 0x88, - 0x30, 0xcd, 0x06, 0xf9, 0xba, 0x6f, 0xca, 0x9c, 0x8a, 0xda, - 0x3e, 0x53, 0x90, 0xd7, 0x16, 0x2e, 0xfc, 0xbc, 0xad, 0xd6, - 0x3d, 0xc0, 0x66, 0x4c, 0x02, 0x3d, 0x31, 0xfd, 0x6c, 0xdb, - 0x1c, 0xdf, 0x96, 0x33, 0x23, 0x02, 0x81, 0xc1, 0x00, 0xc2, - 0x90, 0x47, 0xc4, 0xfb, 0x59, 0xf0, 0xc5, 0x14, 0x75, 0x29, - 0xfa, 0x77, 0xa1, 0x8d, 0xd4, 0x90, 0xa1, 0x0d, 0x3f, 0x16, - 0x88, 0xe3, 0x4c, 0x8f, 0x8f, 0x18, 0x8c, 0x9c, 0x8a, 0xd5, - 0xa7, 0x41, 0x99, 0xf3, 0x80, 0x8e, 0xb1, 0xb8, 0x63, 0xd8, - 0x3f, 0x95, 0xd0, 0xd0, 0x2b, 0xf5, 0xe6, 0x93, 0xe8, 0xfe, - 0xd0, 0x73, 0xd5, 0xbd, 0xb4, 0xee, 0x51, 0x19, 0x6a, 0x10, - 0xca, 0xc8, 0xba, 0xa4, 0x4d, 0x84, 0x54, 0x38, 0x17, 0xb5, - 0xd0, 0xa8, 0x75, 0x22, 0xc5, 0x1b, 0x61, 0xa6, 0x51, 0x88, - 0x63, 0xf0, 0x4f, 0xd1, 0x88, 0xd9, 0x16, 0x49, 0x30, 0xe1, - 0xa8, 0x47, 0xc9, 0x30, 0x1d, 0x5c, 0x75, 0xd8, 0x89, 0xb6, - 0x1d, 0x45, 0xd8, 0x0f, 0x94, 0x89, 0xb3, 0xe4, 0x51, 0xfa, - 0x21, 0xff, 0x6f, 0xb6, 0x30, 0x6f, 0x33, 0x24, 0xbc, 0x09, - 0x98, 0xe9, 0x20, 0x02, 0x0b, 0xde, 0xff, 0xc5, 0x06, 0xb6, - 0x28, 0xa3, 0xa1, 0x07, 0xe8, 0xe1, 0xd2, 0xc2, 0xf1, 0xd1, - 0x23, 0x6b, 0x4c, 0x3a, 0xae, 0x85, 0xec, 0xf9, 0xff, 0xa7, - 0x9b, 0x25, 0xb8, 0x95, 0x1d, 0xa8, 0x14, 0x81, 0x4f, 0x79, - 0x4f, 0xd6, 0x39, 0x5d, 0xe6, 0x5f, 0xd2, 0x34, 0x54, 0x8b, - 0x1e, 0x40, 0x4c, 0x15, 0x5a, 0x45, 0xce, 0x0c, 0xb0, 0xdf, - 0xa1, 0x17, 0xb8, 0xb0, 0x6a, 0x82, 0xa5, 0x97, 0x92, 0x70, - 0xfb, 0x02, 0x81, 0xc0, 0x77, 0x46, 0x44, 0x2b, 0x04, 0xf0, - 0xda, 0x75, 0xaa, 0xd4, 0xc0, 0xc0, 0x32, 0x7f, 0x0f, 0x6c, - 0xb0, 0x27, 0x69, 0xfb, 0x5c, 0x73, 0xeb, 0x47, 0x1e, 0x95, - 0xe2, 0x13, 0x64, 0x1b, 0xb6, 0xd1, 0x1d, 0xca, 0x2b, 0x42, - 0x2f, 0x08, 0x2c, 0x69, 0x27, 0xed, 0xd1, 0xb5, 0x04, 0x23, - 0xc5, 0x85, 0x2d, 0xa1, 0xa2, 0x94, 0xc2, 0x43, 0x4d, 0x49, - 0x92, 0x74, 0x7e, 0x24, 0x92, 0x95, 0xf3, 0x99, 0x9d, 0xd6, - 0x18, 0xe6, 0xcf, 0x9c, 0x45, 0xff, 0x89, 0x08, 0x40, 0x2a, - 0x0e, 0xa0, 0x28, 0xf9, 0x83, 0xfe, 0xc1, 0xe6, 0x40, 0xa8, - 0xe2, 0x29, 0xc9, 0xb0, 0xe8, 0x9a, 0x17, 0xb2, 0x23, 0x7e, - 0xf4, 0x32, 0x08, 0xc9, 0x83, 0xb2, 0x15, 0xb8, 0xc5, 0xc9, - 0x03, 0xd1, 0x9d, 0xda, 0x3e, 0xa8, 0xbf, 0xd5, 0xb7, 0x7d, - 0x65, 0x63, 0x94, 0x5d, 0x5d, 0x94, 0xb4, 0xcf, 0x8d, 0x07, - 0x0b, 0x70, 0x85, 0x8e, 0xce, 0x03, 0x0b, 0x2a, 0x8d, 0xb3, - 0x3c, 0x46, 0xc0, 0x2f, 0xc7, 0x72, 0x6c, 0x9c, 0x5d, 0x07, - 0x0f, 0x45, 0x3b, 0x6b, 0x66, 0x32, 0xab, 0x17, 0x83, 0xd8, - 0x4c, 0x2c, 0x84, 0x71, 0x19, 0x8f, 0xaa, 0x0a, 0xff, 0xbc, - 0xf7, 0x42, 0x10, 0xe8, 0xae, 0x4d, 0x26, 0xaf, 0xdd, 0x06, - 0x33, 0x29, 0x66, 0x21, 0x5d, 0xf5, 0xae, 0x17, 0x07, 0x1f, - 0x87, 0x9e, 0xae, 0x27, 0x1d, 0xd5, 0x02, 0x81, 0xc0, 0x56, - 0x17, 0x4f, 0x9a, 0x8a, 0xf9, 0xde, 0x3e, 0xe6, 0x71, 0x7d, - 0x94, 0xb5, 0xb0, 0xc7, 0xb8, 0x62, 0x12, 0xd1, 0x70, 0xb4, - 0x00, 0xf8, 0x4a, 0xdd, 0x4f, 0x1d, 0x36, 0xc2, 0xe1, 0xef, - 0xee, 0x25, 0x6a, 0x00, 0xc4, 0x46, 0xdf, 0xbe, 0xce, 0x77, - 0x56, 0x93, 0x6d, 0x25, 0x5f, 0xfe, 0x5b, 0xfb, 0xe0, 0xe2, - 0x37, 0xcc, 0xb9, 0xac, 0x4a, 0xce, 0x15, 0x16, 0xa0, 0xc7, - 0x33, 0x63, 0xa4, 0xaa, 0xa5, 0x1e, 0x43, 0xc1, 0xda, 0x43, - 0xfa, 0x43, 0x40, 0x29, 0x95, 0x7c, 0x2b, 0x36, 0x53, 0xe7, - 0x7d, 0x09, 0x4d, 0xd8, 0x52, 0xac, 0x74, 0x5f, 0x08, 0x81, - 0x21, 0x5c, 0x3a, 0x5a, 0xce, 0xf3, 0x25, 0xb6, 0x1e, 0x21, - 0x76, 0x4c, 0x7c, 0x71, 0x50, 0x71, 0xaa, 0x27, 0x02, 0x5b, - 0x23, 0x06, 0x0b, 0x21, 0x5b, 0xc7, 0x28, 0xa3, 0x3d, 0x8d, - 0x25, 0x9b, 0x2a, 0x2d, 0x9d, 0xa1, 0x1c, 0x1d, 0xcb, 0x7d, - 0x78, 0xf8, 0x06, 0x7e, 0x20, 0x7f, 0x24, 0x2a, 0x5c, 0xa4, - 0x04, 0xff, 0x2a, 0x68, 0xe0, 0xe6, 0xa3, 0xd8, 0x6f, 0x56, - 0x73, 0xa1, 0x3a, 0x4e, 0xc9, 0x23, 0xa1, 0x87, 0x22, 0x6a, - 0x74, 0x78, 0x3f, 0x44, 0x1c, 0x77, 0x13, 0xe5, 0x51, 0xef, - 0x89, 0x00, 0x3c, 0x6a, 0x4a, 0x5a, 0x8e, 0xf5, 0x30, 0xa2, - 0x93, 0x7e, 0x92, 0x9b, 0x85, 0x55, 0xaf, 0xfe, 0x24, 0xaf, - 0x57, 0x02, 0x81, 0xc1, 0x00, 0xa4, 0xc2, 0x6a, 0x59, 0x45, - 0xea, 0x71, 0x7d, 0x4c, 0xaf, 0xaf, 0xd6, 0x55, 0x97, 0x73, - 0xc5, 0xa1, 0x3c, 0xf6, 0x59, 0x23, 0xb6, 0x1f, 0x5e, 0x9c, - 0x96, 0x0f, 0x97, 0x66, 0x82, 0x91, 0x48, 0x36, 0x70, 0x02, - 0x67, 0xde, 0x34, 0xa6, 0x95, 0x7b, 0x51, 0x43, 0x66, 0xa4, - 0x16, 0x45, 0x59, 0x12, 0xdb, 0x35, 0x19, 0x4b, 0xbf, 0x1d, - 0xab, 0xf3, 0x3f, 0xb4, 0xb4, 0x6f, 0x66, 0xb0, 0x67, 0xc6, - 0x77, 0x2c, 0x46, 0xa8, 0x03, 0x64, 0x9a, 0x13, 0x9d, 0x40, - 0x22, 0x56, 0x76, 0x1a, 0x7c, 0x1e, 0xe2, 0xda, 0x7f, 0x09, - 0xcf, 0x10, 0xe3, 0xf2, 0xf4, 0x2a, 0x3b, 0x46, 0xc7, 0x61, - 0x9b, 0xef, 0x4a, 0x18, 0x60, 0x8c, 0x32, 0x71, 0xb9, 0xdd, - 0xac, 0xa0, 0xc6, 0x8d, 0x3f, 0xab, 0xc3, 0x21, 0x2c, 0xeb, - 0x91, 0x8f, 0xc7, 0x43, 0x0d, 0x0c, 0x67, 0x9e, 0xab, 0xe6, - 0x8d, 0xb6, 0x2d, 0x41, 0xca, 0x43, 0xd8, 0xcb, 0x30, 0xfb, - 0x3b, 0x40, 0x0d, 0x10, 0x9b, 0xb1, 0x55, 0x93, 0x73, 0x8b, - 0x60, 0xef, 0xc0, 0xee, 0xc0, 0xa6, 0x7a, 0x79, 0x90, 0xfd, - 0x4c, 0x25, 0xd4, 0x4f, 0x67, 0xbe, 0xf7, 0x86, 0x3c, 0x5d, - 0x2b, 0x7d, 0x97, 0x3d, 0xa2, 0x91, 0xa5, 0x06, 0x69, 0xf6, - 0x7a, 0xb8, 0x77, 0xe6, 0x70, 0xa9, 0xd8, 0x86, 0x4b, 0xa6, - 0xcf, 0x67, 0x1d, 0x33, 0xcf, 0xfe, 0x3e -}; - -static unsigned char test4096[] = { - 0x30, 0x82, 0x09, 0x29, 0x02, 0x01, 0x00, 0x02, 0x82, 0x02, - 0x01, 0x00, 0xc0, 0x71, 0xac, 0x1a, 0x13, 0x88, 0x82, 0x43, - 0x3b, 0x51, 0x57, 0x71, 0x8d, 0xb6, 0x2b, 0x82, 0x65, 0x21, - 0x53, 0x5f, 0x28, 0x29, 0x4f, 0x8d, 0x7c, 0x8a, 0xb9, 0x44, - 0xb3, 0x28, 0x41, 0x4f, 0xd3, 0xfa, 0x6a, 0xf8, 0xb9, 0x28, - 0x50, 0x39, 0x67, 0x53, 0x2c, 0x3c, 0xd7, 0xcb, 0x96, 0x41, - 0x40, 0x32, 0xbb, 0xeb, 0x70, 0xae, 0x1f, 0xb0, 0x65, 0xf7, - 0x3a, 0xd9, 0x22, 0xfd, 0x10, 0xae, 0xbd, 0x02, 0xe2, 0xdd, - 0xf3, 0xc2, 0x79, 0x3c, 0xc6, 0xfc, 0x75, 0xbb, 0xaf, 0x4e, - 0x3a, 0x36, 0xc2, 0x4f, 0xea, 0x25, 0xdf, 0x13, 0x16, 0x4b, - 0x20, 0xfe, 0x4b, 0x69, 0x16, 0xc4, 0x7f, 0x1a, 0x43, 0xa6, - 0x17, 0x1b, 0xb9, 0x0a, 0xf3, 0x09, 0x86, 0x28, 0x89, 0xcf, - 0x2c, 0xd0, 0xd4, 0x81, 0xaf, 0xc6, 0x6d, 0xe6, 0x21, 0x8d, - 0xee, 0xef, 0xea, 0xdc, 0xb7, 0xc6, 0x3b, 0x63, 0x9f, 0x0e, - 0xad, 0x89, 0x78, 0x23, 0x18, 0xbf, 0x70, 0x7e, 0x84, 0xe0, - 0x37, 0xec, 0xdb, 0x8e, 0x9c, 0x3e, 0x6a, 0x19, 0xcc, 0x99, - 0x72, 0xe6, 0xb5, 0x7d, 0x6d, 0xfa, 0xe5, 0xd3, 0xe4, 0x90, - 0xb5, 0xb2, 0xb2, 0x12, 0x70, 0x4e, 0xca, 0xf8, 0x10, 0xf8, - 0xa3, 0x14, 0xc2, 0x48, 0x19, 0xeb, 0x60, 0x99, 0xbb, 0x2a, - 0x1f, 0xb1, 0x7a, 0xb1, 0x3d, 0x24, 0xfb, 0xa0, 0x29, 0xda, - 0xbd, 0x1b, 0xd7, 0xa4, 0xbf, 0xef, 0x60, 0x2d, 0x22, 0xca, - 0x65, 0x98, 0xf1, 0xc4, 0xe1, 0xc9, 0x02, 0x6b, 0x16, 0x28, - 0x2f, 0xa1, 0xaa, 0x79, 0x00, 0xda, 0xdc, 0x7c, 0x43, 0xf7, - 0x42, 0x3c, 0xa0, 0xef, 0x68, 0xf7, 0xdf, 0xb9, 0x69, 0xfb, - 0x8e, 0x01, 0xed, 0x01, 0x42, 0xb5, 0x4e, 0x57, 0xa6, 0x26, - 0xb8, 0xd0, 0x7b, 0x56, 0x6d, 0x03, 0xc6, 0x40, 0x8c, 0x8c, - 0x2a, 0x55, 0xd7, 0x9c, 0x35, 0x00, 0x94, 0x93, 0xec, 0x03, - 0xeb, 0x22, 0xef, 0x77, 0xbb, 0x79, 0x13, 0x3f, 0x15, 0xa1, - 0x8f, 0xca, 0xdf, 0xfd, 0xd3, 0xb8, 0xe1, 0xd4, 0xcc, 0x09, - 0x3f, 0x3c, 0x2c, 0xdb, 0xd1, 0x49, 0x7f, 0x38, 0x07, 0x83, - 0x6d, 0xeb, 0x08, 0x66, 0xe9, 0x06, 0x44, 0x12, 0xac, 0x95, - 0x22, 0x90, 0x23, 0x67, 0xd4, 0x08, 0xcc, 0xf4, 0xb7, 0xdc, - 0xcc, 0x87, 0xd4, 0xac, 0x69, 0x35, 0x4c, 0xb5, 0x39, 0x36, - 0xcd, 0xa4, 0xd2, 0x95, 0xca, 0x0d, 0xc5, 0xda, 0xc2, 0xc5, - 0x22, 0x32, 0x28, 0x08, 0xe3, 0xd2, 0x8b, 0x38, 0x30, 0xdc, - 0x8c, 0x75, 0x4f, 0x6a, 0xec, 0x7a, 0xac, 0x16, 0x3e, 0xa8, - 0xd4, 0x6a, 0x45, 0xe1, 0xa8, 0x4f, 0x2e, 0x80, 0x34, 0xaa, - 0x54, 0x1b, 0x02, 0x95, 0x7d, 0x8a, 0x6d, 0xcc, 0x79, 0xca, - 0xf2, 0xa4, 0x2e, 0x8d, 0xfb, 0xfe, 0x15, 0x51, 0x10, 0x0e, - 0x4d, 0x88, 0xb1, 0xc7, 0xf4, 0x79, 0xdb, 0xf0, 0xb4, 0x56, - 0x44, 0x37, 0xca, 0x5a, 0xc1, 0x8c, 0x48, 0xac, 0xae, 0x48, - 0x80, 0x83, 0x01, 0x3f, 0xde, 0xd9, 0xd3, 0x2c, 0x51, 0x46, - 0xb1, 0x41, 0xb6, 0xc6, 0x91, 0x72, 0xf9, 0x83, 0x55, 0x1b, - 0x8c, 0xba, 0xf3, 0x73, 0xe5, 0x2c, 0x74, 0x50, 0x3a, 0xbe, - 0xc5, 0x2f, 0xa7, 0xb2, 0x6d, 0x8c, 0x9e, 0x13, 0x77, 0xa3, - 0x13, 0xcd, 0x6d, 0x8c, 0x45, 0xe1, 0xfc, 0x0b, 0xb7, 0x69, - 0xe9, 0x27, 0xbc, 0x65, 0xc3, 0xfa, 0x9b, 0xd0, 0xef, 0xfe, - 0xe8, 0x1f, 0xb3, 0x5e, 0x34, 0xf4, 0x8c, 0xea, 0xfc, 0xd3, - 0x81, 0xbf, 0x3d, 0x30, 0xb2, 0xb4, 0x01, 0xe8, 0x43, 0x0f, - 0xba, 0x02, 0x23, 0x42, 0x76, 0x82, 0x31, 0x73, 0x91, 0xed, - 0x07, 0x46, 0x61, 0x0d, 0x39, 0x83, 0x40, 0xce, 0x7a, 0xd4, - 0xdb, 0x80, 0x2c, 0x1f, 0x0d, 0xd1, 0x34, 0xd4, 0x92, 0xe3, - 0xd4, 0xf1, 0xc2, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, - 0x82, 0x02, 0x01, 0x00, 0x97, 0x6c, 0xda, 0x6e, 0xea, 0x4f, - 0xcf, 0xaf, 0xf7, 0x4c, 0xd9, 0xf1, 0x90, 0x00, 0x77, 0xdb, - 0xf2, 0x97, 0x76, 0x72, 0xb9, 0xb7, 0x47, 0xd1, 0x9c, 0xdd, - 0xcb, 0x4a, 0x33, 0x6e, 0xc9, 0x75, 0x76, 0xe6, 0xe4, 0xa5, - 0x31, 0x8c, 0x77, 0x13, 0xb4, 0x29, 0xcd, 0xf5, 0x52, 0x17, - 0xef, 0xf3, 0x08, 0x00, 0xe3, 0xbd, 0x2e, 0xbc, 0xd4, 0x52, - 0x88, 0xe9, 0x30, 0x75, 0x0b, 0x02, 0xf5, 0xcd, 0x89, 0x0c, - 0x6c, 0x57, 0x19, 0x27, 0x3d, 0x1e, 0x85, 0xb4, 0xc1, 0x2f, - 0x1d, 0x92, 0x00, 0x5c, 0x76, 0x29, 0x4b, 0xa4, 0xe1, 0x12, - 0xb3, 0xc8, 0x09, 0xfe, 0x0e, 0x78, 0x72, 0x61, 0xcb, 0x61, - 0x6f, 0x39, 0x91, 0x95, 0x4e, 0xd5, 0x3e, 0xc7, 0x8f, 0xb8, - 0xf6, 0x36, 0xfe, 0x9c, 0x93, 0x9a, 0x38, 0x25, 0x7a, 0xf4, - 0x4a, 0x12, 0xd4, 0xa0, 0x13, 0xbd, 0xf9, 0x1d, 0x12, 0x3e, - 0x21, 0x39, 0xfb, 0x72, 0xe0, 0x05, 0x3d, 0xc3, 0xe5, 0x50, - 0xa8, 0x5d, 0x85, 0xa3, 0xea, 0x5f, 0x1c, 0xb2, 0x3f, 0xea, - 0x6d, 0x03, 0x91, 0x55, 0xd8, 0x19, 0x0a, 0x21, 0x12, 0x16, - 0xd9, 0x12, 0xc4, 0xe6, 0x07, 0x18, 0x5b, 0x26, 0xa4, 0xae, - 0xed, 0x2b, 0xb7, 0xa6, 0xed, 0xf8, 0xad, 0xec, 0x77, 0xe6, - 0x7f, 0x4f, 0x76, 0x00, 0xc0, 0xfa, 0x15, 0x92, 0xb4, 0x2c, - 0x22, 0xc2, 0xeb, 0x6a, 0xad, 0x14, 0x05, 0xb2, 0xe5, 0x8a, - 0x9e, 0x85, 0x83, 0xcc, 0x04, 0xf1, 0x56, 0x78, 0x44, 0x5e, - 0xde, 0xe0, 0x60, 0x1a, 0x65, 0x79, 0x31, 0x23, 0x05, 0xbb, - 0x01, 0xff, 0xdd, 0x2e, 0xb7, 0xb3, 0xaa, 0x74, 0xe0, 0xa5, - 0x94, 0xaf, 0x4b, 0xde, 0x58, 0x0f, 0x55, 0xde, 0x33, 0xf6, - 0xe3, 0xd6, 0x34, 0x36, 0x57, 0xd6, 0x79, 0x91, 0x2e, 0xbe, - 0x3b, 0xd9, 0x4e, 0xb6, 0x9d, 0x21, 0x5c, 0xd3, 0x48, 0x14, - 0x7f, 0x4a, 0xc4, 0x60, 0xa9, 0x29, 0xf8, 0x53, 0x7f, 0x88, - 0x11, 0x2d, 0xb5, 0xc5, 0x2d, 0x6f, 0xee, 0x85, 0x0b, 0xf7, - 0x8d, 0x9a, 0xbe, 0xb0, 0x42, 0xf2, 0x2e, 0x71, 0xaf, 0x19, - 0x31, 0x6d, 0xec, 0xcd, 0x6f, 0x2b, 0x23, 0xdf, 0xb4, 0x40, - 0xaf, 0x2c, 0x0a, 0xc3, 0x1b, 0x7d, 0x7d, 0x03, 0x1d, 0x4b, - 0xf3, 0xb5, 0xe0, 0x85, 0xd8, 0xdf, 0x91, 0x6b, 0x0a, 0x69, - 0xf7, 0xf2, 0x69, 0x66, 0x5b, 0xf1, 0xcf, 0x46, 0x7d, 0xe9, - 0x70, 0xfa, 0x6d, 0x7e, 0x75, 0x4e, 0xa9, 0x77, 0xe6, 0x8c, - 0x02, 0xf7, 0x14, 0x4d, 0xa5, 0x41, 0x8f, 0x3f, 0xc1, 0x62, - 0x1e, 0x71, 0x5e, 0x38, 0xb4, 0xd6, 0xe6, 0xe1, 0x4b, 0xc2, - 0x2c, 0x30, 0x83, 0x81, 0x6f, 0x49, 0x2e, 0x96, 0xe6, 0xc9, - 0x9a, 0xf7, 0x5d, 0x09, 0xa0, 0x55, 0x02, 0xa5, 0x3a, 0x25, - 0x23, 0xd0, 0x92, 0xc3, 0xa3, 0xe3, 0x0e, 0x12, 0x2f, 0x4d, - 0xef, 0xf3, 0x55, 0x5a, 0xbe, 0xe6, 0x19, 0x86, 0x31, 0xab, - 0x75, 0x9a, 0xd3, 0xf0, 0x2c, 0xc5, 0x41, 0x92, 0xd9, 0x1f, - 0x5f, 0x11, 0x8c, 0x75, 0x1c, 0x63, 0xd0, 0x02, 0x80, 0x2c, - 0x68, 0xcb, 0x93, 0xfb, 0x51, 0x73, 0x49, 0xb4, 0x60, 0xda, - 0xe2, 0x26, 0xaf, 0xa9, 0x46, 0x12, 0xb8, 0xec, 0x50, 0xdd, - 0x12, 0x06, 0x5f, 0xce, 0x59, 0xe6, 0xf6, 0x1c, 0xe0, 0x54, - 0x10, 0xad, 0xf6, 0xcd, 0x98, 0xcc, 0x0f, 0xfb, 0xcb, 0x41, - 0x14, 0x9d, 0xed, 0xe4, 0xb4, 0x74, 0x5f, 0x09, 0x60, 0xc7, - 0x12, 0xf6, 0x7b, 0x3c, 0x8f, 0xa7, 0x20, 0xbc, 0xe4, 0xb1, - 0xef, 0xeb, 0xa4, 0x93, 0xc5, 0x06, 0xca, 0x9a, 0x27, 0x9d, - 0x87, 0xf3, 0xde, 0xca, 0xe5, 0xe7, 0xf6, 0x1c, 0x01, 0x65, - 0x5b, 0xfb, 0x19, 0x79, 0x6e, 0x08, 0x26, 0xc5, 0xc8, 0x28, - 0x0e, 0xb6, 0x3b, 0x07, 0x08, 0xc1, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xe8, 0x1c, 0x73, 0xa6, 0xb8, 0xe0, 0x0e, 0x6d, 0x8d, - 0x1b, 0xb9, 0x53, 0xed, 0x58, 0x94, 0xe6, 0x1d, 0x60, 0x14, - 0x5c, 0x76, 0x43, 0xc4, 0x58, 0x19, 0xc4, 0x24, 0xe8, 0xbc, - 0x1b, 0x3b, 0x0b, 0x13, 0x24, 0x45, 0x54, 0x0e, 0xcc, 0x37, - 0xf0, 0xe0, 0x63, 0x7d, 0xc3, 0xf7, 0xfb, 0x81, 0x74, 0x81, - 0xc4, 0x0f, 0x1a, 0x21, 0x48, 0xaf, 0xce, 0xc1, 0xc4, 0x94, - 0x18, 0x06, 0x44, 0x8d, 0xd3, 0xd2, 0x22, 0x2d, 0x2d, 0x3e, - 0x5a, 0x31, 0xdc, 0x95, 0x8e, 0xf4, 0x41, 0xfc, 0x58, 0xc9, - 0x40, 0x92, 0x17, 0x5f, 0xe3, 0xda, 0xac, 0x9e, 0x3f, 0x1c, - 0x2a, 0x6b, 0x58, 0x5f, 0x48, 0x78, 0x20, 0xb1, 0xaf, 0x24, - 0x9b, 0x3c, 0x20, 0x8b, 0x93, 0x25, 0x9e, 0xe6, 0x6b, 0xbc, - 0x13, 0x42, 0x14, 0x6c, 0x36, 0x31, 0xff, 0x7a, 0xd1, 0xc1, - 0x1a, 0x26, 0x14, 0x7f, 0xa9, 0x76, 0xa7, 0x0c, 0xf8, 0xcc, - 0xed, 0x07, 0x6a, 0xd2, 0xdf, 0x62, 0xee, 0x0a, 0x7c, 0x84, - 0xcb, 0x49, 0x90, 0xb2, 0x03, 0x0d, 0xa2, 0x82, 0x06, 0x77, - 0xf1, 0xcd, 0x67, 0xf2, 0x47, 0x21, 0x02, 0x3f, 0x43, 0x21, - 0xf0, 0x46, 0x30, 0x62, 0x51, 0x72, 0xb1, 0xe7, 0x48, 0xc6, - 0x67, 0x12, 0xcd, 0x9e, 0xd6, 0x15, 0xe5, 0x21, 0xed, 0xfa, - 0x8f, 0x30, 0xa6, 0x41, 0xfe, 0xb6, 0xfa, 0x8f, 0x34, 0x14, - 0x19, 0xe8, 0x11, 0xf7, 0xa5, 0x77, 0x3e, 0xb7, 0xf9, 0x39, - 0x07, 0x8c, 0x67, 0x2a, 0xab, 0x7b, 0x08, 0xf8, 0xb0, 0x06, - 0xa8, 0xea, 0x2f, 0x8f, 0xfa, 0xcc, 0xcc, 0x40, 0xce, 0xf3, - 0x70, 0x4f, 0x3f, 0x7f, 0xe2, 0x0c, 0xea, 0x76, 0x4a, 0x35, - 0x4e, 0x47, 0xad, 0x2b, 0xa7, 0x97, 0x5d, 0x74, 0x43, 0x97, - 0x90, 0xd2, 0xfb, 0xd9, 0xf9, 0x96, 0x01, 0x33, 0x05, 0xed, - 0x7b, 0x03, 0x05, 0xad, 0xf8, 0x49, 0x03, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xd4, 0x40, 0x17, 0x66, 0x10, 0x92, 0x95, 0xc8, - 0xec, 0x62, 0xa9, 0x7a, 0xcb, 0x93, 0x8e, 0xe6, 0x53, 0xd4, - 0x80, 0x48, 0x27, 0x4b, 0x41, 0xce, 0x61, 0xdf, 0xbf, 0x94, - 0xa4, 0x3d, 0x71, 0x03, 0x0b, 0xed, 0x25, 0x71, 0x98, 0xa4, - 0xd6, 0xd5, 0x4a, 0x57, 0xf5, 0x6c, 0x1b, 0xda, 0x21, 0x7d, - 0x35, 0x45, 0xb3, 0xf3, 0x6a, 0xd9, 0xd3, 0x43, 0xe8, 0x5c, - 0x54, 0x1c, 0x83, 0x1b, 0xb4, 0x5f, 0xf2, 0x97, 0x24, 0x2e, - 0xdc, 0x40, 0xde, 0x92, 0x23, 0x59, 0x8e, 0xbc, 0xd2, 0xa1, - 0xf2, 0xe0, 0x4c, 0xdd, 0x0b, 0xd1, 0xe7, 0xae, 0x65, 0xbc, - 0xb5, 0xf5, 0x5b, 0x98, 0xe9, 0xd7, 0xc2, 0xb7, 0x0e, 0x55, - 0x71, 0x0e, 0x3c, 0x0a, 0x24, 0x6b, 0xa6, 0xe6, 0x14, 0x61, - 0x11, 0xfd, 0x33, 0x42, 0x99, 0x2b, 0x84, 0x77, 0x74, 0x92, - 0x91, 0xf5, 0x79, 0x79, 0xcf, 0xad, 0x8e, 0x04, 0xef, 0x80, - 0x1e, 0x57, 0xf4, 0x14, 0xf5, 0x35, 0x09, 0x74, 0xb2, 0x13, - 0x71, 0x58, 0x6b, 0xea, 0x32, 0x5d, 0xf3, 0xd3, 0x76, 0x48, - 0x39, 0x10, 0x23, 0x84, 0x9d, 0xbe, 0x92, 0x77, 0x4a, 0xed, - 0x70, 0x3e, 0x1a, 0xa2, 0x6c, 0xb3, 0x81, 0x00, 0xc3, 0xc9, - 0xe4, 0x52, 0xc8, 0x24, 0x88, 0x0c, 0x41, 0xad, 0x87, 0x5a, - 0xea, 0xa3, 0x7a, 0x85, 0x1c, 0x5e, 0x31, 0x7f, 0xc3, 0x35, - 0xc6, 0xfa, 0x10, 0xc8, 0x75, 0x10, 0xc4, 0x96, 0x99, 0xe7, - 0xfe, 0x01, 0xb4, 0x74, 0xdb, 0xb4, 0x11, 0xc3, 0xc8, 0x8c, - 0xf6, 0xf7, 0x3b, 0x66, 0x50, 0xfc, 0xdb, 0xeb, 0xca, 0x47, - 0x85, 0x89, 0xe1, 0x65, 0xd9, 0x62, 0x34, 0x3c, 0x70, 0xd8, - 0x2e, 0xb4, 0x2f, 0x65, 0x3c, 0x4a, 0xa6, 0x2a, 0xe7, 0xc7, - 0xd8, 0x41, 0x8f, 0x8a, 0x43, 0xbf, 0x42, 0xf2, 0x4d, 0xbc, - 0xfc, 0x9e, 0x27, 0x95, 0xfb, 0x75, 0xff, 0xab, 0x02, 0x82, - 0x01, 0x00, 0x41, 0x2f, 0x44, 0x57, 0x6d, 0x12, 0x17, 0x5b, - 0x32, 0xc6, 0xb7, 0x6c, 0x57, 0x7a, 0x8a, 0x0e, 0x79, 0xef, - 0x72, 0xa8, 0x68, 0xda, 0x2d, 0x38, 0xe4, 0xbb, 0x8d, 0xf6, - 0x02, 0x65, 0xcf, 0x56, 0x13, 0xe1, 0x1a, 0xcb, 0x39, 0x80, - 0xa6, 0xb1, 0x32, 0x03, 0x1e, 0xdd, 0xbb, 0x35, 0xd9, 0xac, - 0x43, 0x89, 0x31, 0x08, 0x90, 0x92, 0x5e, 0x35, 0x3d, 0x7b, - 0x9c, 0x6f, 0x86, 0xcb, 0x17, 0xdd, 0x85, 0xe4, 0xed, 0x35, - 0x08, 0x8e, 0xc1, 0xf4, 0x05, 0xd8, 0x68, 0xc6, 0x63, 0x3c, - 0xf7, 0xff, 0xf7, 0x47, 0x33, 0x39, 0xc5, 0x3e, 0xb7, 0x0e, - 0x58, 0x35, 0x9d, 0x81, 0xea, 0xf8, 0x6a, 0x2c, 0x1c, 0x5a, - 0x68, 0x78, 0x64, 0x11, 0x6b, 0xc1, 0x3e, 0x4e, 0x7a, 0xbd, - 0x84, 0xcb, 0x0f, 0xc2, 0xb6, 0x85, 0x1d, 0xd3, 0x76, 0xc5, - 0x93, 0x6a, 0x69, 0x89, 0x56, 0x34, 0xdc, 0x4a, 0x9b, 0xbc, - 0xff, 0xa8, 0x0d, 0x6e, 0x35, 0x9c, 0x60, 0xa7, 0x23, 0x30, - 0xc7, 0x06, 0x64, 0x39, 0x8b, 0x94, 0x89, 0xee, 0xba, 0x7f, - 0x60, 0x8d, 0xfa, 0xb6, 0x97, 0x76, 0xdc, 0x51, 0x4a, 0x3c, - 0xeb, 0x3a, 0x14, 0x2c, 0x20, 0x60, 0x69, 0x4a, 0x86, 0xfe, - 0x8c, 0x21, 0x84, 0x49, 0x54, 0xb3, 0x20, 0xe1, 0x01, 0x7f, - 0x58, 0xdf, 0x7f, 0xb5, 0x21, 0x51, 0x8c, 0x47, 0x9f, 0x91, - 0xeb, 0x97, 0x3e, 0xf2, 0x54, 0xcf, 0x16, 0x46, 0xf9, 0xd9, - 0xb6, 0xe7, 0x64, 0xc9, 0xd0, 0x54, 0xea, 0x2f, 0xa1, 0xcf, - 0xa5, 0x7f, 0x28, 0x8d, 0x84, 0xec, 0xd5, 0x39, 0x03, 0x76, - 0x5b, 0x2d, 0x8e, 0x43, 0xf2, 0x01, 0x24, 0xc9, 0x6f, 0xc0, - 0xf5, 0x69, 0x6f, 0x7d, 0xb5, 0x85, 0xd2, 0x5f, 0x7f, 0x78, - 0x40, 0x07, 0x7f, 0x09, 0x15, 0xb5, 0x1f, 0x28, 0x65, 0x10, - 0xe4, 0x19, 0xa8, 0xc6, 0x9e, 0x8d, 0xdc, 0xcb, 0x02, 0x82, - 0x01, 0x00, 0x13, 0x01, 0xee, 0x56, 0x80, 0x93, 0x70, 0x00, - 0x7f, 0x52, 0xd2, 0x94, 0xa1, 0x98, 0x84, 0x4a, 0x92, 0x25, - 0x4c, 0x9b, 0xa9, 0x91, 0x2e, 0xc2, 0x79, 0xb7, 0x5c, 0xe3, - 0xc5, 0xd5, 0x8e, 0xc2, 0x54, 0x16, 0x17, 0xad, 0x55, 0x9b, - 0x25, 0x76, 0x12, 0x63, 0x50, 0x22, 0x2f, 0x58, 0x58, 0x79, - 0x6b, 0x04, 0xe3, 0xf9, 0x9f, 0x8f, 0x04, 0x41, 0x67, 0x94, - 0xa5, 0x1f, 0xac, 0x8a, 0x15, 0x9c, 0x26, 0x10, 0x6c, 0xf8, - 0x19, 0x57, 0x61, 0xd7, 0x3a, 0x7d, 0x31, 0xb0, 0x2d, 0x38, - 0xbd, 0x94, 0x62, 0xad, 0xc4, 0xfa, 0x36, 0x42, 0x42, 0xf0, - 0x24, 0x67, 0x65, 0x9d, 0x8b, 0x0b, 0x7c, 0x6f, 0x82, 0x44, - 0x1a, 0x8c, 0xc8, 0xc9, 0xab, 0xbb, 0x4c, 0x45, 0xfc, 0x7b, - 0x38, 0xee, 0x30, 0xe1, 0xfc, 0xef, 0x8d, 0xbc, 0x58, 0xdf, - 0x2b, 0x5d, 0x0d, 0x54, 0xe0, 0x49, 0x4d, 0x97, 0x99, 0x8f, - 0x22, 0xa8, 0x83, 0xbe, 0x40, 0xbb, 0x50, 0x2e, 0x78, 0x28, - 0x0f, 0x95, 0x78, 0x8c, 0x8f, 0x98, 0x24, 0x56, 0xc2, 0x97, - 0xf3, 0x2c, 0x43, 0xd2, 0x03, 0x82, 0x66, 0x81, 0x72, 0x5f, - 0x53, 0x16, 0xec, 0xb1, 0xb1, 0x04, 0x5e, 0x40, 0x20, 0x48, - 0x7b, 0x3f, 0x02, 0x97, 0x6a, 0xeb, 0x96, 0x12, 0x21, 0x35, - 0xfe, 0x1f, 0x47, 0xc0, 0x95, 0xea, 0xc5, 0x8a, 0x08, 0x84, - 0x4f, 0x5e, 0x63, 0x94, 0x60, 0x0f, 0x71, 0x5b, 0x7f, 0x4a, - 0xec, 0x4f, 0x60, 0xc6, 0xba, 0x4a, 0x24, 0xf1, 0x20, 0x8b, - 0xa7, 0x2e, 0x3a, 0xce, 0x8d, 0xe0, 0x27, 0x1d, 0xb5, 0x8e, - 0xb4, 0x21, 0xc5, 0xe2, 0xa6, 0x16, 0x0a, 0x51, 0x83, 0x55, - 0x88, 0xd1, 0x30, 0x11, 0x63, 0xd5, 0xd7, 0x8d, 0xae, 0x16, - 0x12, 0x82, 0xc4, 0x85, 0x00, 0x4e, 0x27, 0x83, 0xa5, 0x7c, - 0x90, 0x2e, 0xe5, 0xa2, 0xa3, 0xd3, 0x4c, 0x63, 0x02, 0x82, - 0x01, 0x01, 0x00, 0x86, 0x08, 0x98, 0x98, 0xa5, 0x00, 0x05, - 0x39, 0x77, 0xd9, 0x66, 0xb3, 0xcf, 0xca, 0xa0, 0x71, 0xb3, - 0x50, 0xce, 0x3d, 0xb1, 0x93, 0x95, 0x35, 0xc4, 0xd4, 0x2e, - 0x90, 0xdf, 0x0f, 0xfc, 0x60, 0xc1, 0x94, 0x68, 0x61, 0x43, - 0xca, 0x9a, 0x23, 0x4a, 0x1e, 0x45, 0x72, 0x99, 0xb5, 0x1e, - 0x61, 0x8d, 0x77, 0x0f, 0xa0, 0xbb, 0xd7, 0x77, 0xb4, 0x2a, - 0x15, 0x11, 0x88, 0x2d, 0xb3, 0x56, 0x61, 0x5e, 0x6a, 0xed, - 0xa4, 0x46, 0x4a, 0x3f, 0x50, 0x11, 0xd6, 0xba, 0xb6, 0xd7, - 0x95, 0x65, 0x53, 0xc3, 0xa1, 0x8f, 0xe0, 0xa3, 0xf5, 0x1c, - 0xfd, 0xaf, 0x6e, 0x43, 0xd7, 0x17, 0xa7, 0xd3, 0x81, 0x1b, - 0xa4, 0xdf, 0xe0, 0x97, 0x8a, 0x46, 0x03, 0xd3, 0x46, 0x0e, - 0x83, 0x48, 0x4e, 0xd2, 0x02, 0xcb, 0xc0, 0xad, 0x79, 0x95, - 0x8c, 0x96, 0xba, 0x40, 0x34, 0x11, 0x71, 0x5e, 0xe9, 0x11, - 0xf9, 0xc5, 0x4a, 0x5e, 0x91, 0x9d, 0xf5, 0x92, 0x4f, 0xeb, - 0xc6, 0x70, 0x02, 0x2d, 0x3d, 0x04, 0xaa, 0xe9, 0x3a, 0x8e, - 0xd5, 0xa8, 0xad, 0xf7, 0xce, 0x0d, 0x16, 0xb2, 0xec, 0x0a, - 0x9c, 0xf5, 0x94, 0x39, 0xb9, 0x8a, 0xfc, 0x1e, 0xf9, 0xcc, - 0xf2, 0x5f, 0x21, 0x31, 0x74, 0x72, 0x6b, 0x64, 0xae, 0x35, - 0x61, 0x8d, 0x0d, 0xcb, 0xe7, 0xda, 0x39, 0xca, 0xf3, 0x21, - 0x66, 0x0b, 0x95, 0xd7, 0x0a, 0x7c, 0xca, 0xa1, 0xa9, 0x5a, - 0xe8, 0xac, 0xe0, 0x71, 0x54, 0xaf, 0x28, 0xcf, 0xd5, 0x70, - 0x89, 0xe0, 0xf3, 0x9e, 0x43, 0x6c, 0x8d, 0x7b, 0x99, 0x01, - 0x68, 0x4d, 0xa1, 0x45, 0x46, 0x0c, 0x43, 0xbc, 0xcc, 0x2c, - 0xdd, 0xc5, 0x46, 0xc8, 0x4e, 0x0e, 0xbe, 0xed, 0xb9, 0x26, - 0xab, 0x2e, 0xdb, 0xeb, 0x8f, 0xff, 0xdb, 0xb0, 0xc6, 0x55, - 0xaf, 0xf8, 0x2a, 0x91, 0x9d, 0x50, 0x44, 0x21, 0x17, -}; - -static unsigned char test7680[] = { - 0x30, 0x82, 0x11, 0x09, 0x02, 0x01, 0x00, 0x02, 0x82, 0x03, - 0xc1, 0x00, 0xe3, 0x27, 0x46, 0x99, 0xb5, 0x17, 0xab, 0xfa, - 0x65, 0x05, 0x7a, 0x06, 0x81, 0x14, 0xce, 0x43, 0x21, 0x49, - 0x0f, 0x08, 0xf1, 0x70, 0xb4, 0xc1, 0x10, 0xd1, 0x87, 0xf8, - 0x29, 0x91, 0x36, 0x66, 0x2d, 0xbe, 0x7b, 0x1d, 0xa2, 0x0b, - 0x20, 0x38, 0xd9, 0x8e, 0x78, 0x27, 0xcf, 0xb5, 0x45, 0x58, - 0x3d, 0xf4, 0xda, 0xf0, 0xdc, 0x21, 0x17, 0x52, 0xcd, 0x68, - 0xe2, 0x81, 0xac, 0x88, 0x61, 0x10, 0xbc, 0xb0, 0x7f, 0xe4, - 0xf3, 0x78, 0xb7, 0x28, 0x6c, 0x5f, 0x5c, 0xc2, 0x8d, 0x3d, - 0xb0, 0x87, 0x41, 0x15, 0x2e, 0x09, 0x5f, 0xea, 0x06, 0x7f, - 0xe9, 0x35, 0x18, 0x90, 0x50, 0xad, 0xf6, 0xb9, 0xfd, 0x33, - 0x02, 0x1a, 0x99, 0x9e, 0xa5, 0x7d, 0x2c, 0x3b, 0x24, 0xe7, - 0x31, 0x35, 0x73, 0x9a, 0xb0, 0xfe, 0x03, 0xfc, 0xc6, 0x98, - 0x78, 0xd9, 0x66, 0x95, 0xa5, 0x12, 0xbc, 0x1e, 0x82, 0xbc, - 0xf1, 0xc5, 0x31, 0xcd, 0xa6, 0xb1, 0x0c, 0x02, 0xbf, 0x7f, - 0xb7, 0xaf, 0x5f, 0xd6, 0xed, 0xf7, 0xc1, 0x59, 0x86, 0x3a, - 0x35, 0x95, 0x54, 0x21, 0x8d, 0x6a, 0xb3, 0xd1, 0x2b, 0x71, - 0xf5, 0xf1, 0x66, 0x00, 0xb1, 0x88, 0xee, 0x3b, 0xa4, 0x41, - 0x52, 0x1a, 0xf5, 0x0e, 0x32, 0xb6, 0xbf, 0x52, 0xab, 0x51, - 0x55, 0x91, 0x32, 0x4f, 0xaf, 0x91, 0xac, 0xf7, 0xff, 0x8e, - 0x3b, 0x2b, 0x61, 0xe9, 0x6d, 0x1d, 0x68, 0x80, 0x90, 0x79, - 0x34, 0x96, 0xca, 0x49, 0x43, 0x7c, 0x89, 0x4e, 0x5e, 0x31, - 0xb5, 0xce, 0x01, 0x9b, 0x09, 0xaf, 0x92, 0x06, 0x24, 0xe7, - 0x22, 0x35, 0xcc, 0xa2, 0x0b, 0xfb, 0x5b, 0x87, 0x65, 0x71, - 0xff, 0x64, 0x3e, 0xf9, 0xe8, 0x33, 0xa0, 0xc3, 0x4e, 0xb2, - 0x41, 0x98, 0x54, 0xeb, 0x13, 0x99, 0xfb, 0x32, 0x78, 0x7e, - 0xda, 0x4f, 0xd3, 0x46, 0x6a, 0xb5, 0x78, 0x81, 0x3f, 0x04, - 0x13, 0x5f, 0x67, 0xaf, 0x88, 0xa5, 0x9e, 0x0d, 0xc5, 0xf3, - 0xe7, 0x4c, 0x51, 0xf5, 0x51, 0x4a, 0xa4, 0x58, 0x64, 0xd9, - 0xa2, 0x32, 0x54, 0x36, 0xce, 0x38, 0xd8, 0xc2, 0x0e, 0x0d, - 0x60, 0x8e, 0x32, 0x7f, 0x90, 0x8a, 0xbc, 0x88, 0xbe, 0x6a, - 0xc0, 0x47, 0x0f, 0x02, 0x41, 0xff, 0x3b, 0x7e, 0xc5, 0xa6, - 0x33, 0x1d, 0x19, 0xd1, 0xd5, 0x67, 0x6c, 0xbf, 0x16, 0xb0, - 0x7e, 0x80, 0x10, 0xbf, 0x7f, 0xdd, 0xd0, 0xf4, 0xc3, 0x94, - 0x2c, 0x9a, 0x2c, 0xda, 0x69, 0x4e, 0xd6, 0x7b, 0x40, 0x4d, - 0x2a, 0x27, 0xcb, 0x5a, 0xe5, 0x2d, 0x3f, 0x7d, 0x51, 0x9d, - 0x9f, 0x70, 0xde, 0x50, 0xb1, 0xd3, 0xd2, 0x38, 0x4d, 0x1c, - 0xca, 0xc2, 0x1e, 0x80, 0xd0, 0x36, 0x82, 0x04, 0xe6, 0x17, - 0x79, 0x9f, 0x2e, 0xc9, 0xed, 0x2b, 0xd5, 0x1b, 0xfa, 0x7d, - 0x1a, 0x80, 0xb5, 0x0e, 0x2f, 0x05, 0xbe, 0x4a, 0x1b, 0xfe, - 0x0a, 0xad, 0x01, 0xde, 0x91, 0xc8, 0xf9, 0x81, 0xbe, 0xc7, - 0xaf, 0xe7, 0x87, 0xed, 0x9d, 0xb8, 0x6c, 0xad, 0x65, 0xed, - 0x5e, 0xd3, 0x67, 0x8c, 0x62, 0x3a, 0xe7, 0xfd, 0x67, 0xe0, - 0xbb, 0x57, 0xaf, 0x56, 0xeb, 0x4a, 0x58, 0x6e, 0xad, 0xf2, - 0xbe, 0xc3, 0x70, 0x29, 0xf8, 0xeb, 0x68, 0x45, 0xa0, 0xbd, - 0xcd, 0xa5, 0xb4, 0xd9, 0x01, 0xb7, 0x44, 0xeb, 0x97, 0xf3, - 0x0c, 0x56, 0xe4, 0x26, 0xd0, 0xa5, 0xb1, 0xa3, 0x49, 0x6e, - 0x88, 0xf2, 0x22, 0xe2, 0x7b, 0x58, 0x3a, 0xd9, 0x52, 0xa4, - 0xb1, 0x4c, 0x5c, 0x7c, 0xf0, 0x88, 0x7b, 0x9f, 0x06, 0xe9, - 0x32, 0x4e, 0xf2, 0x64, 0x83, 0x8b, 0xa2, 0xea, 0x1d, 0x25, - 0xf1, 0x8d, 0x16, 0x8b, 0xe0, 0xab, 0xd2, 0xe9, 0xe4, 0x6b, - 0x7d, 0x76, 0x98, 0x22, 0x53, 0x31, 0x6b, 0xcc, 0xf1, 0xe5, - 0x1d, 0xd7, 0xa5, 0xb0, 0xea, 0x6b, 0x38, 0x14, 0x0c, 0x06, - 0x10, 0x27, 0xd8, 0x33, 0xf3, 0x9a, 0xae, 0x94, 0xdd, 0x0b, - 0xb4, 0x6d, 0xe5, 0x91, 0xdd, 0xf1, 0x0f, 0x27, 0xa4, 0x94, - 0x55, 0xf0, 0xde, 0x07, 0x29, 0xe6, 0x3f, 0x26, 0x19, 0xa1, - 0xdd, 0xd1, 0x06, 0x99, 0xda, 0x54, 0x23, 0x3c, 0xf5, 0x5c, - 0x2e, 0x96, 0xa9, 0x21, 0x23, 0x25, 0x2e, 0x6f, 0xf1, 0xf9, - 0x11, 0x54, 0xe5, 0x7b, 0xb9, 0x1f, 0x11, 0xe2, 0x9e, 0x6b, - 0x61, 0x8b, 0xa3, 0x8b, 0xc1, 0x20, 0x9b, 0xfb, 0x51, 0xef, - 0xbb, 0xb9, 0xf6, 0xaf, 0x66, 0xb3, 0x2c, 0x25, 0xef, 0x76, - 0xcb, 0xbf, 0x7a, 0x93, 0x2f, 0xe1, 0x17, 0x56, 0xc1, 0x00, - 0x33, 0xb5, 0xd9, 0x91, 0x05, 0x31, 0xcc, 0x72, 0xcd, 0x4a, - 0x93, 0x9a, 0xe3, 0x21, 0x42, 0x9e, 0xb8, 0x4e, 0x6c, 0x27, - 0x93, 0xf0, 0x7f, 0x22, 0xdb, 0xe5, 0xb3, 0xa3, 0xf7, 0xe7, - 0x80, 0xbb, 0x91, 0xca, 0xf7, 0xe8, 0x52, 0xb8, 0x11, 0x64, - 0x66, 0x25, 0x94, 0xf8, 0x6f, 0x0b, 0x3b, 0xb7, 0xff, 0x80, - 0x9e, 0x36, 0xe9, 0x88, 0x2e, 0xab, 0x05, 0xbf, 0x99, 0x9f, - 0x2b, 0x4f, 0xc6, 0xb1, 0x13, 0x5b, 0x06, 0xff, 0x0a, 0x7b, - 0xbc, 0x7f, 0x07, 0xa0, 0x35, 0xc2, 0x2d, 0x44, 0x3e, 0xad, - 0x44, 0xcb, 0x47, 0x18, 0x26, 0x71, 0x7b, 0x17, 0xc9, 0x6d, - 0xb5, 0x4b, 0xcf, 0xdf, 0x14, 0x2c, 0x6c, 0xdf, 0x21, 0xce, - 0x93, 0x49, 0x34, 0x69, 0x49, 0xfd, 0x3e, 0x71, 0x5b, 0xfa, - 0x07, 0xc5, 0x7e, 0x5e, 0x54, 0x1a, 0x3c, 0xa6, 0x29, 0xb5, - 0xbf, 0x0d, 0xf1, 0xc6, 0xa4, 0x61, 0xd6, 0x17, 0x1d, 0xf0, - 0xa2, 0x78, 0x8f, 0xbc, 0x7e, 0x0c, 0xb4, 0xf0, 0x1e, 0x05, - 0xea, 0xb5, 0xad, 0x68, 0x95, 0x0b, 0x27, 0xb4, 0x29, 0x7c, - 0x70, 0x2a, 0x9a, 0x0a, 0x39, 0xd4, 0x76, 0xb7, 0x72, 0x30, - 0x5e, 0xae, 0x9c, 0x4a, 0x55, 0xc7, 0x46, 0xd7, 0x5f, 0xbe, - 0x10, 0x61, 0x25, 0x18, 0x7a, 0x9f, 0xd3, 0x05, 0x3d, 0x6f, - 0x9a, 0x1e, 0xec, 0x2b, 0x03, 0xe0, 0x49, 0x6a, 0x9c, 0xd6, - 0xdb, 0xc2, 0xa1, 0xe1, 0x0a, 0xbb, 0x31, 0x42, 0xc8, 0x43, - 0x4e, 0x7c, 0xa9, 0x7c, 0x60, 0xea, 0xbe, 0xf1, 0x8b, 0xe8, - 0xb2, 0x90, 0x83, 0x14, 0x21, 0xe4, 0xb3, 0x0d, 0x7c, 0x63, - 0x3c, 0x98, 0x55, 0xc6, 0x44, 0xa6, 0xa8, 0x1e, 0x42, 0xb7, - 0x89, 0xa8, 0xbd, 0xb8, 0x34, 0x3d, 0x09, 0x80, 0x99, 0x73, - 0x9f, 0xaf, 0x17, 0x56, 0xf2, 0x73, 0x3e, 0x1e, 0x6e, 0xe9, - 0x18, 0xa0, 0x5b, 0x69, 0xce, 0xfd, 0x3d, 0x77, 0x81, 0x95, - 0x3b, 0xf1, 0xde, 0x26, 0xe9, 0x27, 0xef, 0x92, 0x2a, 0x97, - 0xdc, 0x95, 0xa5, 0xa3, 0xb0, 0xfb, 0x96, 0x89, 0x4f, 0xe6, - 0xc1, 0x42, 0x0b, 0xfd, 0xb4, 0x6d, 0x0a, 0x9f, 0x9b, 0x31, - 0xd8, 0x21, 0x38, 0x8a, 0xee, 0xb6, 0x5c, 0x12, 0xa8, 0xb4, - 0x07, 0x79, 0x41, 0xa7, 0x7f, 0x13, 0x74, 0xad, 0x0b, 0xee, - 0x28, 0x52, 0xac, 0x2f, 0x4d, 0x30, 0x1c, 0xc5, 0xa6, 0xa5, - 0x61, 0x42, 0xbd, 0xe1, 0x4f, 0xd3, 0xec, 0x66, 0xf2, 0x63, - 0xf4, 0x93, 0xdb, 0x35, 0x2d, 0x3b, 0x71, 0x25, 0x09, 0xde, - 0xda, 0x46, 0xda, 0xe2, 0xa7, 0xa3, 0xdf, 0xcd, 0xbf, 0x58, - 0x05, 0x25, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x03, - 0xc0, 0x5f, 0xd5, 0x15, 0x1b, 0x09, 0xe4, 0xa7, 0xc0, 0xa6, - 0xd8, 0x0d, 0xa8, 0x2a, 0xd3, 0x1d, 0x46, 0x03, 0x07, 0xf0, - 0x98, 0xe4, 0x4b, 0x99, 0x66, 0x8e, 0x72, 0xe7, 0xbb, 0x51, - 0xc6, 0x1a, 0xbe, 0x36, 0xf4, 0x52, 0xba, 0xa8, 0xbf, 0xaa, - 0xe3, 0x71, 0x1d, 0x83, 0x21, 0xc0, 0xa6, 0x88, 0x4f, 0xf7, - 0x2b, 0x93, 0x26, 0xe4, 0xa7, 0xed, 0x50, 0x18, 0xaa, 0xf4, - 0x4c, 0xa2, 0xfe, 0x92, 0x7c, 0xde, 0x2e, 0x54, 0x76, 0xc2, - 0x25, 0x1e, 0x98, 0xa6, 0x48, 0x01, 0x39, 0x6f, 0x1f, 0x24, - 0x97, 0x9b, 0x64, 0x95, 0x1c, 0x8d, 0x63, 0x8d, 0x44, 0x6f, - 0x9d, 0xdf, 0xf4, 0x1a, 0xa5, 0x9a, 0x1e, 0xd3, 0x6c, 0xae, - 0xa9, 0x8c, 0x3f, 0xfb, 0x2f, 0x78, 0xf6, 0xa6, 0xd6, 0x06, - 0xd3, 0xb7, 0x26, 0xff, 0x1e, 0xdb, 0x8d, 0xcc, 0x37, 0x4d, - 0x5c, 0xe2, 0xc3, 0xa5, 0x75, 0xe6, 0xf9, 0xb4, 0x4c, 0x84, - 0x6f, 0x9e, 0x58, 0x55, 0xc8, 0x01, 0xfa, 0x32, 0xd2, 0x6e, - 0x2b, 0x45, 0xf2, 0xc6, 0x48, 0xad, 0x40, 0xd8, 0xb9, 0x3c, - 0x1b, 0xf8, 0xf7, 0x82, 0xd3, 0x0e, 0x73, 0xe3, 0xb1, 0x5b, - 0x82, 0x71, 0x77, 0x3f, 0x6f, 0x36, 0x9a, 0xe0, 0xec, 0x51, - 0xf8, 0x5f, 0x84, 0x92, 0xee, 0xb8, 0x7e, 0xe7, 0x1a, 0x14, - 0x50, 0x82, 0x7a, 0x4d, 0xe6, 0xd6, 0xa3, 0x76, 0x24, 0x8a, - 0x5f, 0xfe, 0x19, 0xdd, 0xd7, 0xf7, 0x5b, 0xae, 0x18, 0x04, - 0x90, 0xcd, 0x5c, 0xe5, 0x64, 0xe8, 0x04, 0xb1, 0x06, 0xa5, - 0xdd, 0xf8, 0x9d, 0x71, 0x13, 0xaa, 0x36, 0x7f, 0x61, 0x27, - 0xf4, 0xac, 0x95, 0x7d, 0x1a, 0x99, 0x7d, 0xe0, 0xd5, 0x9c, - 0x5a, 0xad, 0x9a, 0xff, 0x54, 0xb0, 0xb1, 0x55, 0x45, 0x2d, - 0x19, 0x58, 0x52, 0x28, 0xdd, 0xe0, 0xb5, 0x65, 0x52, 0x97, - 0x45, 0xf0, 0x2b, 0x98, 0x1f, 0x61, 0x6c, 0x9d, 0xaa, 0x59, - 0x85, 0xf9, 0x97, 0x7b, 0xbd, 0xeb, 0x95, 0x81, 0xfb, 0x29, - 0x8c, 0xf0, 0x52, 0xdf, 0xed, 0xee, 0xb2, 0x00, 0x32, 0x35, - 0x14, 0xa8, 0xa4, 0xca, 0x91, 0xff, 0x18, 0xb7, 0x96, 0xfb, - 0x32, 0x62, 0xa9, 0xa0, 0xd0, 0x77, 0x43, 0xf5, 0x99, 0xd1, - 0xee, 0xe8, 0xad, 0x1a, 0x2c, 0xd4, 0xeb, 0xe1, 0xf5, 0x01, - 0x41, 0x78, 0xc0, 0x27, 0x19, 0x50, 0x2e, 0xba, 0x22, 0xd1, - 0xeb, 0xb3, 0xa5, 0x27, 0x0b, 0xec, 0xf9, 0x26, 0x7e, 0x1f, - 0xe7, 0x17, 0x9f, 0x39, 0xa8, 0x72, 0x22, 0x63, 0x79, 0x6a, - 0x9c, 0x89, 0x55, 0x9a, 0xb4, 0x61, 0x41, 0xbc, 0xaa, 0x14, - 0x37, 0x29, 0x03, 0xc0, 0x52, 0x4e, 0x31, 0x44, 0x8f, 0x2e, - 0x17, 0x81, 0x88, 0xf4, 0xce, 0xda, 0x41, 0xb8, 0xd5, 0x14, - 0x91, 0x8c, 0xca, 0xd2, 0x0d, 0x99, 0x06, 0x09, 0xc2, 0xb7, - 0xe8, 0xae, 0xfa, 0x01, 0xea, 0x99, 0x62, 0x68, 0xb6, 0xdf, - 0xc8, 0x27, 0xae, 0xbf, 0xb0, 0x9b, 0x5b, 0x1a, 0xa2, 0xe2, - 0x5a, 0x7a, 0xe5, 0x4b, 0x92, 0x1f, 0xff, 0x73, 0xae, 0x16, - 0x40, 0x78, 0x42, 0x28, 0xbb, 0x13, 0x5e, 0xbc, 0x71, 0x7a, - 0x78, 0x3e, 0xd8, 0x1b, 0xc2, 0x2c, 0xd6, 0xdc, 0xfa, 0x39, - 0x72, 0xf8, 0xa2, 0x2c, 0x8b, 0x1c, 0x5d, 0xab, 0xb8, 0x07, - 0xc7, 0xae, 0x29, 0x93, 0x68, 0xbf, 0x61, 0xe9, 0xa4, 0x37, - 0x83, 0x7d, 0x13, 0xc7, 0x18, 0xf0, 0x7d, 0xa4, 0x20, 0x47, - 0x14, 0x68, 0x95, 0x46, 0x56, 0x6d, 0xd5, 0x7b, 0xe1, 0x51, - 0x8f, 0x96, 0xc1, 0x7b, 0x35, 0x09, 0x7a, 0x89, 0x0e, 0xdf, - 0x12, 0xd5, 0xe1, 0x9c, 0x2a, 0x94, 0x95, 0x43, 0x93, 0x48, - 0xa6, 0x23, 0xe6, 0xd8, 0xf2, 0xb8, 0x0e, 0xba, 0x6d, 0x61, - 0x03, 0xaf, 0x40, 0x63, 0x2b, 0x2f, 0xee, 0x61, 0x4c, 0xc4, - 0x70, 0x3d, 0x78, 0xc1, 0x4f, 0x8e, 0x0b, 0x9b, 0x06, 0x35, - 0x6d, 0x6d, 0x83, 0x37, 0xbb, 0x39, 0x7d, 0x7f, 0x33, 0x93, - 0xc4, 0xeb, 0x8e, 0xfc, 0xda, 0xf0, 0x54, 0xfe, 0x1d, 0xc4, - 0xd3, 0x83, 0x99, 0xdf, 0x65, 0xee, 0x00, 0x7d, 0x86, 0x27, - 0xd4, 0x3a, 0x6b, 0xe6, 0x82, 0x8e, 0x58, 0x2d, 0x03, 0x38, - 0xef, 0x6c, 0x82, 0x87, 0x18, 0x3b, 0x47, 0xe7, 0xbc, 0xe1, - 0x58, 0x70, 0x4d, 0x46, 0x96, 0x34, 0x60, 0x96, 0x15, 0x09, - 0x3c, 0x84, 0x40, 0xaf, 0x80, 0x32, 0x75, 0xc7, 0x23, 0x6c, - 0xfb, 0x1d, 0x57, 0x73, 0x19, 0x09, 0xe8, 0x1a, 0x4c, 0x02, - 0x5c, 0x7e, 0x4e, 0xbe, 0x75, 0xf8, 0x73, 0xff, 0x2d, 0x54, - 0x19, 0x55, 0xf5, 0xf4, 0x1b, 0xc9, 0xbc, 0xc2, 0x19, 0xcb, - 0xb7, 0x4e, 0x6a, 0x0d, 0xff, 0xca, 0x7d, 0xd0, 0x88, 0x91, - 0x8b, 0x9b, 0x21, 0xa4, 0xa2, 0x43, 0x0d, 0xbc, 0x9e, 0x73, - 0x7d, 0x54, 0x7d, 0x95, 0xcc, 0x63, 0x5e, 0xc1, 0xb8, 0xe6, - 0x27, 0xff, 0x20, 0x07, 0xe8, 0x6e, 0x7e, 0xf2, 0x0f, 0x5a, - 0x09, 0xef, 0xe5, 0x4d, 0x80, 0x39, 0x95, 0xd5, 0xf4, 0xee, - 0x3b, 0xca, 0x7c, 0x73, 0xf8, 0x39, 0x5a, 0xc1, 0x1d, 0x7d, - 0x94, 0x72, 0x32, 0xad, 0x58, 0xe2, 0xfc, 0x71, 0x6e, 0x66, - 0xaa, 0xa1, 0x59, 0xd6, 0xac, 0xab, 0xbe, 0x8c, 0x53, 0x99, - 0xcd, 0xe8, 0x2d, 0xb5, 0xb3, 0x46, 0x58, 0x2e, 0x16, 0xd7, - 0x4d, 0x8b, 0x7d, 0x4a, 0xb1, 0x4c, 0x85, 0x91, 0x1b, 0x57, - 0x54, 0xf8, 0x14, 0x59, 0xdb, 0xc4, 0x2c, 0x9c, 0x08, 0x6d, - 0x3d, 0xd7, 0xf6, 0xa6, 0xe6, 0xb3, 0x2a, 0xe7, 0x29, 0x1c, - 0xab, 0xb4, 0xed, 0x13, 0x19, 0xf8, 0xb6, 0x60, 0x92, 0x44, - 0x53, 0xd4, 0xa9, 0x7e, 0xba, 0x21, 0xa2, 0xdc, 0x6e, 0xa5, - 0x5e, 0x53, 0x59, 0x3c, 0x52, 0x61, 0x7b, 0x5f, 0x19, 0xad, - 0xc8, 0x6d, 0x68, 0x8d, 0x7a, 0xc9, 0xd6, 0xef, 0xeb, 0x67, - 0x4f, 0xca, 0xe7, 0xf6, 0x29, 0x36, 0x97, 0xfb, 0x3e, 0x37, - 0x95, 0x85, 0x71, 0x70, 0xf6, 0x63, 0x86, 0x2a, 0x29, 0xd7, - 0x9a, 0x96, 0x76, 0xa7, 0x47, 0x98, 0x4e, 0x06, 0x31, 0xaf, - 0xf3, 0x4f, 0x2a, 0x65, 0x90, 0x6a, 0x4b, 0x8e, 0x43, 0x79, - 0xe2, 0xdd, 0xce, 0x08, 0x1c, 0x01, 0xec, 0x38, 0x41, 0xdd, - 0x19, 0xd8, 0xf3, 0x36, 0x03, 0x35, 0x03, 0xaf, 0x1c, 0x45, - 0x3c, 0xac, 0x13, 0xaa, 0x36, 0x16, 0x48, 0x77, 0xb3, 0xbe, - 0xa3, 0xb3, 0x9d, 0x7f, 0x20, 0xca, 0x74, 0x65, 0xac, 0x93, - 0xa7, 0x54, 0xad, 0xc8, 0x68, 0x0e, 0xf8, 0x44, 0x1f, 0xad, - 0x2c, 0xb7, 0x9a, 0x9a, 0x07, 0xe5, 0xcd, 0x87, 0xe0, 0x14, - 0xb5, 0xaf, 0xd3, 0xd7, 0xcf, 0x13, 0x9f, 0x3b, 0xbd, 0xfe, - 0x29, 0x0b, 0x72, 0xf5, 0x4c, 0x54, 0x94, 0xc7, 0x66, 0xec, - 0xa8, 0x41, 0x96, 0x3d, 0x17, 0xed, 0x19, 0xc0, 0x82, 0x3e, - 0x5f, 0x9a, 0x91, 0xfe, 0xd1, 0x2f, 0xb8, 0x94, 0xaa, 0x58, - 0x68, 0x95, 0x31, 0x87, 0x57, 0x9a, 0x75, 0x94, 0x4d, 0x38, - 0x7d, 0x56, 0x82, 0x81, 0x9c, 0xb9, 0x34, 0x2b, 0xe7, 0x40, - 0xd9, 0x3c, 0x77, 0x5b, 0x95, 0x51, 0x06, 0x11, 0x41, 0xe3, - 0x8b, 0xb7, 0x32, 0xeb, 0xe1, 0x05, 0x1b, 0x10, 0xa8, 0x0e, - 0xa1, 0x02, 0x82, 0x01, 0xe1, 0x00, 0xfa, 0x38, 0x34, 0xfe, - 0x55, 0x87, 0x71, 0x62, 0x47, 0x00, 0x33, 0x64, 0x67, 0x70, - 0x79, 0x76, 0xdf, 0xfe, 0xc3, 0x28, 0x38, 0xdf, 0x90, 0xd4, - 0xc0, 0xee, 0x98, 0xbf, 0x9d, 0x9b, 0x85, 0xd8, 0x61, 0x65, - 0xa5, 0x70, 0xf5, 0xd2, 0x2c, 0xbf, 0x2f, 0xb5, 0x55, 0x79, - 0x92, 0x13, 0xba, 0x4d, 0x3c, 0x39, 0xbf, 0xd5, 0x31, 0x13, - 0x7a, 0x31, 0xf4, 0x8b, 0xce, 0xf8, 0xd0, 0xd3, 0x9b, 0xe2, - 0xee, 0x31, 0xdb, 0xba, 0xcc, 0x1a, 0xba, 0x1c, 0x8d, 0xee, - 0xea, 0xcb, 0xd3, 0x5a, 0xad, 0x87, 0xd6, 0xf9, 0x15, 0x2f, - 0x6e, 0x00, 0x06, 0x74, 0x25, 0x8d, 0xff, 0xc8, 0xa6, 0x11, - 0x1c, 0xe8, 0x16, 0x1a, 0xde, 0x53, 0x05, 0xb9, 0x53, 0x55, - 0x28, 0x83, 0x3d, 0xbe, 0x61, 0x0c, 0xc4, 0x98, 0x7d, 0xf6, - 0xec, 0x36, 0xc3, 0xe5, 0xe7, 0x1d, 0x14, 0x64, 0xcb, 0x0d, - 0x62, 0x5d, 0x7a, 0xcd, 0x88, 0xfc, 0x66, 0x4e, 0xf9, 0x36, - 0x47, 0x95, 0x18, 0x3a, 0x48, 0x2a, 0xff, 0x62, 0x8f, 0x6c, - 0xe2, 0xc2, 0xe9, 0xd3, 0x6a, 0x45, 0x5c, 0xf5, 0x89, 0x53, - 0x5c, 0xbe, 0xcf, 0xad, 0x87, 0x22, 0x9c, 0x31, 0x48, 0xdb, - 0xd8, 0xe4, 0xe5, 0x38, 0xae, 0xc2, 0xb0, 0xd2, 0xba, 0xb7, - 0x30, 0x53, 0x2d, 0xb1, 0x35, 0xf1, 0x58, 0x0f, 0x8a, 0x06, - 0x51, 0x76, 0xb9, 0x2c, 0x32, 0xe0, 0xd1, 0xaa, 0x82, 0x34, - 0x69, 0x71, 0x1c, 0x5f, 0x35, 0xa8, 0x9d, 0x11, 0xac, 0x13, - 0xdb, 0x7b, 0xf6, 0x93, 0xe3, 0xb9, 0xbd, 0xd9, 0xb2, 0x86, - 0xff, 0x61, 0x88, 0x2b, 0x72, 0x5c, 0x84, 0xe1, 0x0c, 0x72, - 0xab, 0x44, 0xff, 0x23, 0x13, 0xaf, 0xd1, 0x5a, 0xd3, 0xea, - 0x73, 0xfe, 0xd5, 0xa4, 0x7d, 0x9e, 0x4e, 0xac, 0x03, 0x93, - 0x72, 0x14, 0x2d, 0x96, 0x6f, 0xee, 0xb4, 0xcd, 0x4e, 0xab, - 0xea, 0x71, 0x93, 0x81, 0xe0, 0x3d, 0xcd, 0x61, 0x96, 0x25, - 0x76, 0xbd, 0xc4, 0xb5, 0xdd, 0x7c, 0xf1, 0xb9, 0xe1, 0x2c, - 0x58, 0x1b, 0xa4, 0x46, 0x4b, 0x12, 0x57, 0x58, 0xaa, 0x3a, - 0xae, 0x89, 0xa3, 0xb3, 0xcf, 0x1f, 0x8d, 0x67, 0xdf, 0x6d, - 0x7e, 0x8e, 0xfa, 0xc5, 0x09, 0x73, 0x46, 0x56, 0x55, 0x90, - 0xeb, 0x77, 0x4e, 0x16, 0x4f, 0x68, 0x7b, 0x1f, 0x61, 0x23, - 0xec, 0xa9, 0x71, 0x30, 0x33, 0x25, 0xc7, 0x4e, 0x26, 0x2e, - 0x4e, 0x2b, 0xc2, 0x64, 0x5f, 0xf5, 0x8f, 0x7a, 0x4b, 0x1c, - 0x06, 0xb3, 0x91, 0xf6, 0x9b, 0x51, 0xb7, 0xb0, 0x64, 0x72, - 0x04, 0xe5, 0xfa, 0x14, 0x2f, 0xed, 0x61, 0x29, 0x03, 0x73, - 0x19, 0x15, 0x6e, 0x2c, 0x8b, 0x0e, 0xec, 0x4d, 0xf1, 0xe3, - 0x6f, 0x58, 0x7c, 0xc9, 0x48, 0x67, 0x3f, 0x51, 0xb5, 0xb7, - 0x26, 0x46, 0xa7, 0x25, 0x79, 0x55, 0xfe, 0x3a, 0x44, 0xb4, - 0x44, 0xfc, 0xb8, 0x14, 0x34, 0x47, 0xd7, 0xa3, 0x0e, 0x76, - 0xe7, 0x83, 0x9a, 0x02, 0xc3, 0xcf, 0x2b, 0xd9, 0x83, 0x93, - 0xd5, 0xee, 0x99, 0x74, 0x45, 0x62, 0x23, 0xa6, 0x02, 0xc9, - 0xc0, 0x10, 0x70, 0x0a, 0x99, 0x29, 0x0c, 0x79, 0x04, 0x4c, - 0x77, 0x21, 0x96, 0xf0, 0xa5, 0x17, 0x22, 0xbe, 0xab, 0x9b, - 0xd7, 0x42, 0xd3, 0xe9, 0xc0, 0x42, 0x44, 0x7d, 0x9d, 0xc9, - 0x3d, 0xf9, 0x36, 0x97, 0x1b, 0x75, 0x52, 0x8f, 0xe9, 0xb9, - 0x8c, 0xa7, 0x64, 0x19, 0x5b, 0x5d, 0x60, 0xb4, 0x42, 0x95, - 0xc9, 0xdb, 0x82, 0x03, 0xc6, 0xb0, 0x28, 0x72, 0x64, 0x03, - 0x41, 0x4d, 0x8f, 0xc6, 0xd0, 0xcd, 0x02, 0x82, 0x01, 0xe1, - 0x00, 0xe8, 0x66, 0xa7, 0xf9, 0x0f, 0x5a, 0x21, 0xfc, 0x88, - 0x4e, 0x91, 0xd5, 0x4a, 0xf0, 0xf4, 0x32, 0xe5, 0x0d, 0xf3, - 0x06, 0x95, 0xd0, 0x4e, 0x47, 0x0c, 0x04, 0x66, 0x77, 0xfd, - 0xb8, 0x93, 0x0d, 0xff, 0x8f, 0x97, 0xa0, 0x4a, 0x36, 0x37, - 0xa6, 0x5e, 0x95, 0x79, 0xc8, 0xb2, 0x21, 0x98, 0x81, 0xf1, - 0xb8, 0xf4, 0x52, 0xaf, 0x3c, 0x8c, 0x86, 0x85, 0x55, 0x56, - 0xfc, 0x90, 0xe3, 0x32, 0x50, 0x7c, 0x54, 0x07, 0x9e, 0xed, - 0xfc, 0xd4, 0xb9, 0x5c, 0x98, 0x22, 0xfb, 0x72, 0xd7, 0x83, - 0xf0, 0xd1, 0x61, 0x10, 0xbd, 0x68, 0x5d, 0x72, 0xc1, 0xce, - 0x92, 0x43, 0x77, 0x9f, 0xb8, 0x8d, 0x8e, 0xf2, 0xe3, 0x62, - 0x4a, 0x93, 0x03, 0xd3, 0xd9, 0x01, 0xa8, 0x99, 0x6f, 0xa3, - 0x4c, 0x6d, 0x7a, 0xf2, 0x9e, 0x8e, 0x6b, 0xbc, 0xe4, 0x9d, - 0x8e, 0xe7, 0x25, 0x86, 0xa4, 0xa9, 0xc2, 0xef, 0xdf, 0xbb, - 0x6e, 0x3d, 0x4b, 0x57, 0x95, 0x81, 0x6f, 0x68, 0x3f, 0x19, - 0xa8, 0xff, 0x5a, 0x08, 0x7a, 0xe4, 0x4c, 0x4e, 0xb4, 0xea, - 0xf4, 0xc8, 0x2f, 0xef, 0x8c, 0x5e, 0xcd, 0x62, 0x1c, 0x8c, - 0x93, 0x60, 0x5d, 0xa3, 0x11, 0x64, 0x0b, 0xeb, 0x6d, 0x21, - 0xbc, 0x3a, 0x5b, 0x5c, 0x0c, 0xa7, 0x8a, 0xc6, 0xa8, 0xe1, - 0x48, 0x81, 0x01, 0xb5, 0x65, 0xab, 0x2e, 0xbe, 0x38, 0x94, - 0xf7, 0xa6, 0x33, 0xc1, 0x6e, 0x0b, 0x88, 0x38, 0xe7, 0x1b, - 0x04, 0x9a, 0x10, 0x2d, 0x1d, 0x3f, 0x5f, 0x5f, 0xc8, 0xef, - 0xcd, 0xc5, 0x16, 0xdc, 0x84, 0xc0, 0x66, 0xe0, 0xa3, 0xfc, - 0xfa, 0x96, 0xc7, 0xb7, 0xec, 0x4f, 0x40, 0x0a, 0xc5, 0xbe, - 0x6d, 0x39, 0x4a, 0x7e, 0x91, 0x4f, 0xe1, 0x03, 0xd2, 0x39, - 0xbc, 0x87, 0x69, 0xa1, 0xf0, 0x6d, 0x11, 0xf5, 0xb4, 0x9d, - 0xae, 0x76, 0x6b, 0xc6, 0xbf, 0xe4, 0x47, 0xbc, 0x4d, 0x13, - 0x88, 0xa8, 0x83, 0xf5, 0xae, 0x1d, 0xfb, 0x4d, 0x4c, 0x44, - 0x03, 0xd8, 0xa4, 0x2e, 0x4d, 0xf8, 0x5f, 0x45, 0x94, 0x58, - 0xd7, 0xd9, 0x4b, 0x47, 0xd8, 0xfc, 0x35, 0x05, 0xed, 0xb4, - 0xb6, 0xc2, 0x36, 0x2e, 0xba, 0xd2, 0x7a, 0xba, 0x69, 0x34, - 0xbf, 0xf1, 0xa1, 0x5e, 0x17, 0x71, 0x89, 0xd3, 0x54, 0x57, - 0x05, 0x2b, 0x82, 0xe3, 0x0a, 0x64, 0x5c, 0x3b, 0x8c, 0x6b, - 0xc7, 0x10, 0x8a, 0xb5, 0xd3, 0xd7, 0x90, 0xeb, 0xdb, 0x1d, - 0xa0, 0xbf, 0x6b, 0xea, 0xcd, 0x31, 0x7a, 0x8d, 0x64, 0xcc, - 0x58, 0xc0, 0x07, 0xa4, 0x6e, 0x14, 0x0b, 0xf3, 0xea, 0x3e, - 0x87, 0x9f, 0x7c, 0xb8, 0x1c, 0x22, 0x26, 0x8a, 0x7d, 0x90, - 0xdd, 0x57, 0x28, 0x38, 0xcc, 0x0e, 0x71, 0x92, 0x89, 0xee, - 0x79, 0x88, 0xbc, 0x05, 0x21, 0xda, 0x42, 0x92, 0x52, 0x66, - 0xac, 0x4a, 0xe5, 0xf5, 0x6e, 0x47, 0xd5, 0xba, 0x37, 0xd3, - 0x7c, 0x89, 0xd4, 0xd8, 0x6f, 0xde, 0x63, 0x44, 0xb5, 0x88, - 0xdd, 0xb1, 0x30, 0xb4, 0x6d, 0xcd, 0xbf, 0xc8, 0x34, 0x27, - 0x59, 0x7d, 0x79, 0xdc, 0x96, 0x5b, 0x8e, 0xc0, 0x87, 0xc0, - 0x4e, 0x40, 0x07, 0x13, 0x91, 0x6b, 0x3a, 0x12, 0x03, 0x64, - 0x70, 0xaf, 0x80, 0x24, 0x1c, 0x5c, 0xfb, 0xf5, 0xc0, 0x74, - 0x5e, 0xaf, 0x06, 0x18, 0x04, 0x67, 0x4a, 0xbd, 0xac, 0xd7, - 0xca, 0xbe, 0x4e, 0xa1, 0x19, 0x48, 0x7d, 0xa6, 0x59, 0xf6, - 0x1a, 0x62, 0x50, 0x53, 0x46, 0xa4, 0x5b, 0x9c, 0x5a, 0xfd, - 0x89, 0x9d, 0xd4, 0xde, 0xf4, 0xa7, 0x3d, 0x88, 0x73, 0xa5, - 0xb9, 0x02, 0x82, 0x01, 0xe1, 0x00, 0xe7, 0x70, 0x59, 0xc3, - 0xed, 0xc4, 0x6b, 0xa1, 0xa5, 0x5e, 0x90, 0x2a, 0x8c, 0x6a, - 0xc2, 0x4e, 0xab, 0xfc, 0xee, 0xf2, 0x23, 0x38, 0xd6, 0xb3, - 0x93, 0x08, 0x9e, 0x0c, 0x8e, 0x71, 0x2d, 0xa9, 0xe8, 0xdc, - 0xa5, 0xdc, 0x07, 0xe3, 0xb1, 0x33, 0xdd, 0xa2, 0xf2, 0x3e, - 0x92, 0x58, 0xe0, 0xf7, 0x53, 0x7f, 0x6e, 0xea, 0x78, 0x8c, - 0x35, 0x78, 0x43, 0x63, 0x95, 0xbb, 0x1b, 0x1c, 0xbf, 0x91, - 0x75, 0x14, 0x74, 0xd3, 0x20, 0xba, 0x8f, 0xee, 0x9d, 0x71, - 0xa1, 0x87, 0x8a, 0x24, 0xd3, 0x61, 0x53, 0xfb, 0xec, 0x16, - 0x84, 0xbe, 0x4d, 0x39, 0xdd, 0x0a, 0xac, 0xce, 0x20, 0x9c, - 0xaf, 0x8a, 0x13, 0xf8, 0x22, 0x2f, 0xd4, 0x99, 0x88, 0x74, - 0xba, 0x16, 0x3a, 0x63, 0xff, 0x4c, 0x5a, 0x03, 0x5a, 0x6f, - 0xac, 0x29, 0x33, 0xa5, 0x50, 0xd1, 0xda, 0xed, 0x27, 0xcb, - 0x67, 0x72, 0x63, 0x85, 0xfc, 0xf0, 0xc8, 0x88, 0xbf, 0x85, - 0xef, 0x4b, 0xfe, 0xae, 0xd9, 0xd5, 0xbb, 0x86, 0xa4, 0x76, - 0xe8, 0x7f, 0xb4, 0xdb, 0xb1, 0xee, 0x1a, 0x7f, 0x99, 0xd7, - 0x9b, 0x6f, 0x7a, 0x94, 0x5c, 0xec, 0x2c, 0x60, 0x81, 0xad, - 0xa7, 0xbe, 0x80, 0x2e, 0x9f, 0xa6, 0xc0, 0xfb, 0x09, 0x6d, - 0x2b, 0xab, 0xa4, 0x15, 0xc7, 0x79, 0x46, 0x24, 0x89, 0x5c, - 0x32, 0xb9, 0x87, 0xa9, 0x54, 0x1e, 0x12, 0x90, 0x8e, 0x02, - 0x80, 0x8c, 0xf8, 0xdb, 0x2f, 0xbc, 0x98, 0x1b, 0xa2, 0x78, - 0x73, 0x89, 0x03, 0x97, 0xe3, 0x09, 0x08, 0x8b, 0x75, 0xcf, - 0xdc, 0x23, 0x90, 0x59, 0xef, 0x5b, 0x98, 0x24, 0xb8, 0xe8, - 0xcf, 0x75, 0xf0, 0x2f, 0xb7, 0xa3, 0xe6, 0x17, 0x06, 0xf0, - 0x52, 0xfe, 0x21, 0x0a, 0x16, 0x8e, 0xf8, 0xe1, 0xae, 0x25, - 0x11, 0x5d, 0x8c, 0x95, 0x1b, 0x4f, 0x45, 0xb8, 0xa8, 0xcd, - 0xe6, 0xf9, 0xca, 0xa0, 0x54, 0x93, 0x95, 0x86, 0x6f, 0xe4, - 0x93, 0x22, 0x0f, 0xf2, 0xcf, 0xbd, 0x23, 0xb0, 0xf4, 0x8f, - 0x99, 0xa7, 0x67, 0x99, 0x05, 0x13, 0x1f, 0xeb, 0x88, 0xf8, - 0xe2, 0x3b, 0xb9, 0x49, 0x35, 0x89, 0x4f, 0xb8, 0x06, 0x37, - 0x36, 0xda, 0x75, 0x25, 0x0f, 0x0a, 0xaa, 0xc2, 0x6c, 0x3e, - 0xb1, 0x2d, 0x16, 0xf3, 0x17, 0xdb, 0xe2, 0x16, 0x32, 0x39, - 0x92, 0x4b, 0x5f, 0xc0, 0x5f, 0x6e, 0xd0, 0x1c, 0x7e, 0xc0, - 0x51, 0xd9, 0xb3, 0xe2, 0x37, 0xc7, 0xe0, 0x40, 0x13, 0x7d, - 0x06, 0xcd, 0xcd, 0x72, 0xb6, 0x53, 0x2d, 0x7e, 0x60, 0x49, - 0xfe, 0x31, 0xe1, 0xd0, 0x0e, 0x4c, 0x98, 0x93, 0xe0, 0xf6, - 0xf2, 0xfa, 0x99, 0x7f, 0x65, 0xd8, 0x15, 0xc6, 0x3a, 0xb8, - 0x4d, 0x63, 0x21, 0x78, 0xe4, 0x19, 0x6b, 0xbd, 0xde, 0x40, - 0x5b, 0x8c, 0xfa, 0x49, 0x75, 0x23, 0x8f, 0x14, 0xc2, 0x3b, - 0xa3, 0x9b, 0xc5, 0x80, 0x1a, 0xa3, 0x60, 0xd7, 0x17, 0x27, - 0xf0, 0x18, 0x0f, 0xba, 0x02, 0xf7, 0x7a, 0xed, 0xa4, 0x00, - 0x77, 0xde, 0x4b, 0xdd, 0xf9, 0xd7, 0x3e, 0x75, 0xed, 0x1a, - 0x43, 0x26, 0x71, 0x1b, 0xbc, 0x72, 0xf5, 0x70, 0x72, 0x03, - 0x70, 0x25, 0x87, 0x81, 0x6a, 0x92, 0x2d, 0xb7, 0x02, 0xf0, - 0x10, 0x79, 0x65, 0x9d, 0x4e, 0x11, 0x7d, 0x5c, 0x5b, 0x37, - 0xaa, 0xb4, 0xfa, 0x43, 0x66, 0x48, 0x6c, 0x67, 0x64, 0x9e, - 0x15, 0x75, 0x36, 0xe7, 0x25, 0x55, 0x07, 0x7f, 0x74, 0x1f, - 0x2c, 0x28, 0x76, 0xe7, 0x9b, 0x3d, 0x91, 0x0b, 0xcd, 0x6a, - 0x1d, 0x5a, 0xea, 0x63, 0xd0, 0xf9, 0x02, 0x82, 0x01, 0xe0, - 0x3e, 0x31, 0xf2, 0xf4, 0x29, 0x92, 0xa2, 0x93, 0xd5, 0xda, - 0xc9, 0x16, 0x7e, 0xf6, 0xdb, 0x33, 0x9f, 0xaf, 0x4b, 0x01, - 0xd1, 0x28, 0x2d, 0x3a, 0xc0, 0x51, 0x91, 0x26, 0xbd, 0xa5, - 0x1e, 0xdd, 0xd9, 0x2e, 0x11, 0x93, 0x19, 0x29, 0x47, 0x5d, - 0x63, 0xe4, 0xb6, 0xf1, 0xea, 0x12, 0x29, 0xa1, 0x65, 0x12, - 0x6d, 0x78, 0x8f, 0x63, 0x31, 0xec, 0x72, 0x54, 0x73, 0x72, - 0x26, 0x48, 0x57, 0x57, 0xc8, 0xde, 0x28, 0x27, 0xf5, 0x62, - 0xfb, 0x7f, 0x1b, 0xf3, 0xaf, 0x31, 0x01, 0xfc, 0x01, 0x58, - 0x7a, 0x80, 0x72, 0x9d, 0x6e, 0x07, 0xcc, 0x45, 0x67, 0xc6, - 0x26, 0xfe, 0x25, 0xa5, 0x9b, 0x64, 0xcd, 0x45, 0xe3, 0x31, - 0x38, 0x05, 0x07, 0x36, 0x05, 0x46, 0x9c, 0xc1, 0x8e, 0xbf, - 0x4e, 0x71, 0x5f, 0xea, 0xe5, 0x0c, 0x9a, 0x41, 0xc8, 0x94, - 0xcc, 0xf1, 0x73, 0x06, 0x30, 0x54, 0x76, 0x23, 0xb7, 0x22, - 0x7a, 0x8e, 0xe6, 0x42, 0xa1, 0xa0, 0x32, 0x12, 0xe9, 0x08, - 0x1c, 0x46, 0x79, 0x0c, 0x82, 0x7a, 0x95, 0x79, 0xbf, 0x83, - 0x80, 0xeb, 0xab, 0x3d, 0x32, 0xc5, 0xde, 0x62, 0xeb, 0x90, - 0x29, 0x73, 0x05, 0xc8, 0x0a, 0xb1, 0x51, 0xf1, 0x23, 0xdd, - 0x1e, 0xf5, 0x02, 0x3e, 0x74, 0xbc, 0x24, 0x0c, 0x60, 0x36, - 0x2a, 0x28, 0x4d, 0xe6, 0x86, 0x98, 0x7c, 0xd9, 0xe1, 0xac, - 0x21, 0x33, 0xaa, 0xa9, 0x8b, 0xb6, 0x8a, 0x1b, 0xf7, 0x54, - 0x14, 0xf3, 0x0d, 0x4f, 0xcd, 0x7c, 0xf5, 0xc2, 0x6d, 0xc2, - 0xf0, 0xe2, 0xfc, 0x63, 0x1e, 0xa6, 0xa9, 0xa9, 0xd9, 0x73, - 0x2a, 0xd5, 0x0a, 0x38, 0xd8, 0xc0, 0xb7, 0xe1, 0x51, 0xe4, - 0x23, 0x37, 0xf7, 0x85, 0x66, 0x0e, 0x3f, 0x1a, 0x8c, 0xcf, - 0x12, 0xa2, 0x47, 0x6f, 0x73, 0x91, 0x21, 0xe3, 0x93, 0x6b, - 0x74, 0x4f, 0xc5, 0xa1, 0xe7, 0x32, 0xf7, 0x86, 0xdd, 0x1a, - 0x6e, 0x96, 0xda, 0x32, 0x1d, 0xdd, 0xfa, 0x42, 0xd5, 0xd4, - 0xfd, 0xae, 0x7a, 0xa1, 0xed, 0x3d, 0x79, 0xfe, 0x88, 0x84, - 0x43, 0xa7, 0xec, 0xf3, 0x7a, 0x13, 0xaa, 0xa1, 0x82, 0x02, - 0x83, 0x19, 0x43, 0x0a, 0x46, 0x78, 0x07, 0xd9, 0x4d, 0xff, - 0xac, 0x67, 0xd6, 0x29, 0x89, 0xfe, 0x2b, 0xab, 0x5f, 0x9a, - 0x87, 0x99, 0x80, 0xaf, 0x70, 0x4a, 0x6a, 0xb9, 0x5a, 0xc2, - 0xac, 0x7f, 0xa2, 0xc7, 0xad, 0xe2, 0x1f, 0xec, 0xc5, 0x12, - 0x17, 0x08, 0x87, 0x8f, 0x20, 0x95, 0xbe, 0xaf, 0x62, 0x2c, - 0xc2, 0x3f, 0x89, 0x56, 0xd8, 0x50, 0x96, 0x97, 0x72, 0xe2, - 0x92, 0xe1, 0x2a, 0xd8, 0x84, 0x9f, 0x31, 0xe3, 0x06, 0xd8, - 0xe5, 0x91, 0x63, 0x19, 0xe1, 0x27, 0xad, 0xe2, 0xf2, 0x0a, - 0x5e, 0x78, 0x8b, 0x1b, 0x13, 0x31, 0x4b, 0xbd, 0x77, 0xb2, - 0xd6, 0x5c, 0x92, 0x81, 0x50, 0x02, 0x37, 0xd2, 0xe6, 0xeb, - 0x66, 0x6b, 0xaa, 0xfc, 0xcd, 0x54, 0x5d, 0xb8, 0x03, 0x87, - 0xe8, 0xfa, 0xb2, 0xde, 0xcb, 0xf8, 0x6e, 0x58, 0xde, 0xcb, - 0x09, 0x54, 0x8a, 0x9f, 0x46, 0xa3, 0x7e, 0x8d, 0x15, 0xff, - 0x1b, 0x0d, 0x89, 0xc4, 0x1a, 0x21, 0x31, 0x5e, 0xed, 0x0b, - 0x67, 0x3c, 0x70, 0xed, 0x92, 0x48, 0xef, 0xec, 0xf0, 0x77, - 0xc2, 0x79, 0x6c, 0x06, 0x09, 0xaa, 0xab, 0xf6, 0x4c, 0xcd, - 0xfa, 0x7e, 0x4a, 0x88, 0xdc, 0xa8, 0x9b, 0xd3, 0x69, 0x94, - 0x88, 0x09, 0x1d, 0x30, 0x43, 0x9e, 0x2c, 0xcb, 0x01, 0x1d, - 0x4a, 0x3b, 0x04, 0xec, 0x0e, 0xb1, 0xde, 0x09, 0xad, 0x29, - 0x02, 0x82, 0x01, 0xe1, 0x00, 0x9f, 0x02, 0x13, 0x7a, 0xd0, - 0xa9, 0x8a, 0x7a, 0xa0, 0x05, 0xbb, 0x44, 0x6f, 0xaf, 0xf7, - 0xe3, 0xd4, 0x35, 0xef, 0x73, 0x39, 0xd5, 0xe0, 0xa2, 0x0f, - 0x1a, 0x25, 0xa8, 0xf7, 0xc2, 0xa5, 0xec, 0x57, 0xf8, 0x0d, - 0x2a, 0xb6, 0x64, 0x03, 0x8c, 0x22, 0x0f, 0xe7, 0x98, 0xa1, - 0x12, 0xfe, 0x24, 0xef, 0x61, 0x28, 0x9f, 0xa7, 0x22, 0x6b, - 0x6d, 0xab, 0x8d, 0x7d, 0x2a, 0x8b, 0xae, 0x8b, 0xfd, 0xcb, - 0xd5, 0x0b, 0x79, 0x1b, 0x89, 0xcb, 0x5b, 0x7a, 0x8c, 0xdc, - 0xe8, 0x8d, 0xdd, 0x35, 0x9f, 0x06, 0x69, 0x64, 0x12, 0xeb, - 0x46, 0x79, 0xdf, 0x82, 0x2c, 0x89, 0x75, 0x9e, 0x7a, 0xec, - 0xad, 0xe5, 0x88, 0x31, 0xfa, 0x86, 0x93, 0xca, 0xf1, 0x2d, - 0x9b, 0x62, 0x5a, 0xe9, 0x43, 0x09, 0xf3, 0x8c, 0xe5, 0xc7, - 0xc0, 0xce, 0x86, 0xe7, 0xdb, 0xc7, 0x4d, 0x27, 0xd5, 0xee, - 0x76, 0xce, 0x35, 0x30, 0x47, 0xef, 0x00, 0x1b, 0x69, 0x9a, - 0x3f, 0xa5, 0x2a, 0xc9, 0x07, 0xab, 0x99, 0xba, 0x2a, 0xe7, - 0xfb, 0xa9, 0x4e, 0xb9, 0xae, 0x2c, 0x50, 0xfc, 0x35, 0x49, - 0xe6, 0x97, 0x78, 0x3c, 0xb1, 0x59, 0xd7, 0x1d, 0x4e, 0x4e, - 0xea, 0xde, 0xa0, 0xd0, 0xc4, 0x1d, 0xb1, 0xd3, 0x53, 0x1e, - 0xf9, 0xbf, 0xb3, 0x6a, 0x17, 0xb4, 0xda, 0xcc, 0x27, 0x19, - 0xc6, 0x35, 0xe8, 0x28, 0xd3, 0xe3, 0x76, 0x3a, 0xdc, 0xd0, - 0x75, 0xc8, 0xb4, 0x6c, 0xbe, 0x84, 0x2a, 0x45, 0xd1, 0x43, - 0x22, 0x54, 0xd7, 0xc5, 0xd0, 0xd7, 0x73, 0x35, 0x6b, 0xa8, - 0xfa, 0xad, 0x60, 0xc0, 0x64, 0xc1, 0x58, 0x89, 0x09, 0x81, - 0x0a, 0x0b, 0xea, 0x33, 0x91, 0xb0, 0xef, 0x53, 0x50, 0x41, - 0xae, 0xd9, 0xee, 0xbe, 0x9e, 0xf0, 0x0b, 0xa0, 0x7c, 0xbf, - 0x3f, 0xc9, 0x4b, 0xe0, 0x48, 0xd8, 0x10, 0xd5, 0x2e, 0xce, - 0xf0, 0x7c, 0xd8, 0x05, 0xde, 0x09, 0x7e, 0x8c, 0x63, 0x4c, - 0xdb, 0x8b, 0x91, 0xcd, 0x7f, 0xb6, 0x6b, 0xad, 0xce, 0xb1, - 0x17, 0x6c, 0xf7, 0x08, 0x0d, 0x7c, 0xda, 0x4f, 0x0a, 0x07, - 0xd0, 0xae, 0x72, 0x3c, 0x67, 0x4a, 0x44, 0x54, 0x47, 0xce, - 0xe1, 0x17, 0x07, 0x12, 0xde, 0x52, 0xef, 0xef, 0x4c, 0x2b, - 0x42, 0x7d, 0x09, 0x80, 0x36, 0x34, 0xdc, 0x45, 0x6f, 0xb0, - 0x2d, 0xab, 0xa0, 0x0c, 0x58, 0xae, 0x35, 0xd3, 0x9b, 0x37, - 0xc1, 0x1d, 0xeb, 0xfe, 0xc3, 0x04, 0xc9, 0x1d, 0xe7, 0x3d, - 0x16, 0x64, 0xed, 0xf5, 0xe8, 0xdf, 0x99, 0xa4, 0xfb, 0xad, - 0x79, 0x88, 0xd5, 0x8c, 0x62, 0x33, 0x9e, 0x35, 0xa6, 0x7f, - 0x9d, 0xb6, 0x1a, 0x40, 0x6d, 0xc3, 0x89, 0x5d, 0x7b, 0xe2, - 0xc8, 0xd3, 0x16, 0x13, 0x07, 0x9a, 0x38, 0x22, 0x33, 0x03, - 0xac, 0x70, 0x3e, 0xce, 0x32, 0x56, 0x0b, 0x58, 0x56, 0xb8, - 0xe9, 0xd8, 0x42, 0x35, 0x6c, 0xb9, 0x02, 0xb3, 0x64, 0xeb, - 0xaa, 0x09, 0x3f, 0xac, 0x66, 0x08, 0xb4, 0x5f, 0x3e, 0xb4, - 0xec, 0x39, 0xb1, 0x99, 0xe4, 0x5d, 0x1d, 0x32, 0x14, 0xc1, - 0x48, 0x8f, 0x6c, 0x65, 0x87, 0x34, 0x50, 0xa4, 0xf4, 0x9b, - 0x5b, 0x2e, 0xb5, 0x79, 0x0d, 0x11, 0x62, 0xa4, 0x35, 0x9c, - 0x6f, 0x92, 0xd0, 0x68, 0x07, 0xdd, 0x69, 0x85, 0x48, 0xe3, - 0x5d, 0x10, 0x34, 0xaf, 0xea, 0x41, 0x72, 0x5a, 0x71, 0x00, - 0xf8, 0xe6, 0x47, 0x7f, 0xa0, 0x6f, 0x91, 0x96, 0x40, 0x00, - 0x40, 0x70, 0xfb, 0x63, 0xcf, 0xc9, 0x36, 0x04, 0x1c, 0x3b, - 0x11, 0x08, 0x29, 0x81, 0x9f -}; - -static unsigned char test15360[] = { - 0x30, 0x82, 0x21, 0xe8, 0x02, 0x01, 0x00, 0x02, 0x82, 0x07, - 0x81, 0x00, 0xad, 0x3f, 0xaa, 0xdc, 0x8c, 0x85, 0xcb, 0x60, - 0xd2, 0xf5, 0x30, 0xa1, 0x0f, 0x26, 0xec, 0xdf, 0xfc, 0x91, - 0x39, 0xbd, 0x3e, 0x8f, 0x99, 0x64, 0x1e, 0x51, 0xd2, 0x27, - 0x5e, 0x76, 0xcd, 0x86, 0x33, 0x07, 0xf9, 0xbd, 0x3b, 0x06, - 0xc3, 0x3c, 0x85, 0xcb, 0x7e, 0x91, 0x14, 0xb0, 0x0b, 0x77, - 0x22, 0x30, 0x71, 0xb8, 0xbb, 0x74, 0x30, 0x33, 0x35, 0x56, - 0x34, 0x47, 0x10, 0x8f, 0x88, 0xe2, 0x6f, 0xdc, 0x3b, 0xe9, - 0x58, 0x9d, 0x0c, 0xdc, 0x8f, 0x70, 0x41, 0x7a, 0x12, 0xd2, - 0x9a, 0x35, 0xbe, 0x0a, 0x57, 0x13, 0x0c, 0xe9, 0xbf, 0x77, - 0x54, 0x00, 0x74, 0xb7, 0x1a, 0x3e, 0xa7, 0xe9, 0xb6, 0xe7, - 0x4f, 0x1e, 0xa4, 0xc0, 0x7c, 0x4c, 0x66, 0xc5, 0xce, 0xad, - 0x96, 0x1b, 0xe2, 0x1a, 0xf1, 0x3d, 0x8b, 0x50, 0xcf, 0xe2, - 0x15, 0x21, 0x6d, 0x83, 0x95, 0x00, 0xee, 0x97, 0xc4, 0xae, - 0xc9, 0x38, 0x62, 0x6c, 0xb2, 0xe7, 0x7f, 0x15, 0x0a, 0xab, - 0x86, 0xb9, 0xd9, 0x8a, 0xf8, 0xeb, 0x88, 0x5d, 0xdc, 0x0c, - 0x1e, 0xc5, 0xe6, 0xa1, 0x7b, 0xbf, 0xf1, 0x02, 0xe3, 0xad, - 0xf8, 0xed, 0x17, 0x9f, 0x83, 0x11, 0x31, 0x3b, 0xad, 0xb4, - 0xf9, 0x8d, 0x1d, 0x56, 0x9b, 0xac, 0x68, 0x55, 0x0a, 0x74, - 0x20, 0xee, 0x57, 0xe7, 0x1c, 0x6d, 0x05, 0xa1, 0x4e, 0xa5, - 0x11, 0x99, 0xb4, 0x86, 0xdb, 0x58, 0xe7, 0xf6, 0xb6, 0x4f, - 0x92, 0x58, 0x57, 0x9b, 0x74, 0x04, 0xe5, 0xd1, 0x1d, 0x7c, - 0x4b, 0xb8, 0x1f, 0x5d, 0x0e, 0x93, 0xee, 0x44, 0x18, 0xb6, - 0x58, 0x0e, 0xa1, 0x0b, 0x8e, 0x2e, 0x99, 0x4c, 0x72, 0x91, - 0xfa, 0xfa, 0xe2, 0x22, 0x05, 0x5d, 0x2b, 0x2d, 0xd8, 0x60, - 0xd5, 0x1b, 0x08, 0x56, 0x2b, 0xb5, 0x21, 0xdb, 0x1a, 0xe6, - 0xa8, 0x39, 0xa2, 0xf4, 0x58, 0xcb, 0xd2, 0xf9, 0xce, 0xc0, - 0x1e, 0x1b, 0xf9, 0xa7, 0x37, 0xca, 0xa3, 0x77, 0x6e, 0xb1, - 0xaf, 0x33, 0xb5, 0x6d, 0x5f, 0x33, 0x2e, 0x1a, 0x34, 0xdb, - 0x42, 0xbe, 0x5f, 0xf9, 0x09, 0xb7, 0x9f, 0xd4, 0x09, 0xfb, - 0x87, 0x13, 0x3c, 0xe2, 0x27, 0xb8, 0xf3, 0x1d, 0x7e, 0x92, - 0xdd, 0x87, 0x86, 0x55, 0x69, 0x9b, 0x55, 0xcd, 0xef, 0x7a, - 0x71, 0x5d, 0x81, 0x3a, 0xd9, 0xf7, 0x7f, 0xde, 0xe0, 0x92, - 0xd9, 0x78, 0x0f, 0x1d, 0x43, 0xb1, 0x1e, 0x29, 0xc1, 0x49, - 0xb6, 0x5e, 0x85, 0x83, 0xd9, 0x04, 0xfd, 0x79, 0xd8, 0x47, - 0x03, 0x2e, 0x85, 0x19, 0xfd, 0x63, 0xe7, 0xa4, 0x8b, 0xc0, - 0x94, 0x0e, 0xb7, 0x54, 0x97, 0xd6, 0x44, 0x5d, 0x63, 0x12, - 0xff, 0xdd, 0xde, 0x2c, 0x00, 0x0e, 0xc9, 0xca, 0x7e, 0xa2, - 0x65, 0x25, 0xb0, 0x1d, 0xa9, 0x20, 0x4f, 0xdd, 0xea, 0x3a, - 0xb5, 0xe8, 0x0f, 0xf3, 0xb2, 0xb7, 0x00, 0x4a, 0xe8, 0xa4, - 0x83, 0x49, 0xbd, 0x78, 0xdf, 0xac, 0x2c, 0x37, 0x81, 0xb3, - 0xf3, 0xb7, 0x13, 0x93, 0x3e, 0xb2, 0x79, 0x55, 0xf2, 0xd8, - 0x9c, 0xf7, 0xf2, 0xf1, 0xd5, 0x6c, 0x9c, 0xff, 0xec, 0xf4, - 0xea, 0x08, 0x3c, 0x65, 0x35, 0xb7, 0x09, 0x03, 0x6d, 0x99, - 0x1d, 0x5b, 0x73, 0x06, 0x61, 0xb4, 0xf0, 0xc5, 0xdb, 0x3e, - 0xe0, 0x1d, 0xa8, 0x5b, 0x7a, 0x5b, 0x5b, 0x9c, 0x11, 0x75, - 0x83, 0x1d, 0xf4, 0x73, 0x27, 0xf3, 0x79, 0xf2, 0x82, 0xd6, - 0x28, 0x45, 0x58, 0x23, 0x6c, 0x29, 0xd3, 0x50, 0x51, 0x1b, - 0x38, 0xef, 0x89, 0x90, 0x84, 0xa2, 0x4c, 0x35, 0x7b, 0x30, - 0x5e, 0xbd, 0x1a, 0xd5, 0xdf, 0xcd, 0xcd, 0x74, 0x3f, 0x2e, - 0x01, 0xea, 0x33, 0x07, 0x74, 0xfb, 0x86, 0x75, 0x20, 0x0e, - 0x4f, 0xbf, 0x65, 0xd4, 0x15, 0x19, 0x6f, 0x8d, 0x37, 0xcd, - 0xb6, 0x6f, 0x50, 0x9d, 0x5e, 0x04, 0x81, 0x7d, 0xec, 0xd6, - 0xbb, 0x40, 0x1b, 0xe0, 0xf5, 0xd5, 0x86, 0x26, 0xc5, 0x41, - 0x84, 0x0e, 0x3e, 0x73, 0xb7, 0xa4, 0xbe, 0x2a, 0xfe, 0xd7, - 0xe4, 0x4d, 0x5c, 0x2d, 0x6a, 0x04, 0xe6, 0xdd, 0x28, 0xa0, - 0x75, 0x4c, 0xe0, 0x23, 0x2c, 0xad, 0xec, 0xaa, 0x72, 0xfd, - 0x03, 0xc0, 0x65, 0xfa, 0xc4, 0x3c, 0x25, 0x10, 0xae, 0x3f, - 0x09, 0x96, 0x4e, 0xff, 0xfe, 0xc7, 0xe4, 0x9e, 0xec, 0xb5, - 0x6e, 0xec, 0xf3, 0x7a, 0x83, 0x7a, 0x8b, 0xbb, 0x91, 0x8d, - 0xab, 0x3c, 0x4d, 0x7f, 0x34, 0x77, 0xbe, 0x0c, 0x87, 0xf2, - 0xc3, 0xd6, 0xcb, 0xcc, 0xfa, 0x1e, 0xaf, 0x21, 0x24, 0xe9, - 0xaa, 0x89, 0x61, 0x0c, 0x7a, 0x1c, 0x7d, 0x00, 0x87, 0x69, - 0x30, 0xa0, 0xb4, 0x3b, 0x96, 0x1c, 0x00, 0x14, 0x07, 0xb8, - 0x3f, 0x59, 0x62, 0x3a, 0x3f, 0xfb, 0x68, 0xb8, 0x81, 0x7d, - 0x4a, 0x9d, 0x1c, 0xa2, 0x07, 0xa3, 0xb1, 0x42, 0x7b, 0xfa, - 0x9b, 0xbc, 0x94, 0x30, 0x7e, 0xea, 0xe7, 0x40, 0x7e, 0xd4, - 0x0f, 0x33, 0x3b, 0x57, 0xda, 0x8b, 0x6d, 0x64, 0xd5, 0xe4, - 0x91, 0x83, 0xf0, 0x3d, 0xae, 0x8b, 0x91, 0xf0, 0xcd, 0xb1, - 0xa0, 0xe0, 0x0d, 0xe1, 0xbb, 0x22, 0x78, 0x1f, 0x3a, 0xe5, - 0x53, 0x28, 0xf0, 0x35, 0xae, 0x71, 0xe6, 0xfd, 0x63, 0xb2, - 0x9c, 0x3f, 0xdd, 0x95, 0x7b, 0xc4, 0xe9, 0x2f, 0xd9, 0x93, - 0x3a, 0x10, 0x42, 0x1c, 0x90, 0xab, 0xfb, 0xd3, 0x02, 0xe9, - 0x59, 0xbc, 0x53, 0x7e, 0xf3, 0xe1, 0x52, 0x15, 0xa6, 0x58, - 0x9e, 0xc1, 0xa6, 0x0e, 0x2e, 0x35, 0x07, 0x3a, 0xc3, 0x1f, - 0xaa, 0x58, 0xe7, 0xc6, 0x33, 0x6a, 0x39, 0x4b, 0x21, 0x15, - 0x3d, 0x92, 0x4e, 0x5e, 0xf9, 0x01, 0xd6, 0x0f, 0x28, 0x61, - 0x15, 0xdf, 0xed, 0x6f, 0x75, 0xc4, 0x8f, 0xcb, 0x16, 0x55, - 0x09, 0xc7, 0x24, 0xb2, 0x0c, 0x49, 0x25, 0x8d, 0x5e, 0xf1, - 0x0e, 0xe0, 0xe2, 0xc4, 0xcc, 0x1f, 0x4e, 0x60, 0x5c, 0x5e, - 0xc6, 0x7f, 0x68, 0x7f, 0xdb, 0x1a, 0x01, 0x67, 0x07, 0xb1, - 0x56, 0x93, 0xf2, 0x26, 0x81, 0xc0, 0x33, 0xb8, 0x48, 0xf9, - 0x2c, 0x5c, 0x18, 0x29, 0xed, 0xe0, 0x6c, 0xa0, 0xac, 0xd2, - 0x90, 0x4b, 0x52, 0x87, 0xbb, 0xb5, 0x05, 0xd8, 0x56, 0xc5, - 0xb8, 0x8f, 0x3f, 0x49, 0x52, 0x9a, 0xa2, 0xd0, 0x40, 0x80, - 0x5b, 0x16, 0x15, 0xbc, 0x74, 0x8e, 0x00, 0x10, 0xaf, 0xfb, - 0x6d, 0xba, 0xcb, 0xbc, 0xe6, 0x13, 0x75, 0xce, 0x27, 0xae, - 0x85, 0x57, 0x6c, 0xc0, 0x8a, 0x84, 0x6f, 0x34, 0x16, 0xd4, - 0x35, 0xd2, 0xcc, 0x55, 0x00, 0xc1, 0xd8, 0x28, 0x2c, 0x9c, - 0x84, 0x78, 0xbf, 0xf0, 0x3b, 0x0d, 0x9f, 0x81, 0xd4, 0xef, - 0x99, 0x77, 0x53, 0xd2, 0x8e, 0x43, 0x52, 0xf0, 0x32, 0x7e, - 0xba, 0xbf, 0xb6, 0x0e, 0x9d, 0x9b, 0x00, 0xd0, 0x50, 0x55, - 0x67, 0x5a, 0x2c, 0x8b, 0x9b, 0x29, 0xfb, 0x41, 0x74, 0x4c, - 0xb7, 0xd8, 0x98, 0xa2, 0xfb, 0x73, 0x07, 0x96, 0xef, 0xcd, - 0x47, 0x13, 0x1d, 0xe2, 0xb1, 0xac, 0xf3, 0xcf, 0x47, 0x98, - 0x7b, 0x6f, 0xf6, 0x32, 0x44, 0x41, 0x78, 0x09, 0x8e, 0x64, - 0x0c, 0xbf, 0xe2, 0x0f, 0x8c, 0x44, 0x2f, 0x4e, 0x55, 0xe0, - 0xc6, 0xfd, 0x05, 0x74, 0x18, 0x1a, 0xb9, 0xfa, 0xcb, 0xd3, - 0xfa, 0x69, 0x50, 0x63, 0xce, 0x2b, 0xef, 0x92, 0x0f, 0x11, - 0xd4, 0x9b, 0x53, 0x6c, 0xed, 0xc5, 0x0b, 0x7c, 0xbd, 0xa1, - 0x5d, 0xdf, 0xab, 0xcf, 0xaa, 0x83, 0x5e, 0xa8, 0xc5, 0xfe, - 0x91, 0x2b, 0x23, 0x1f, 0x39, 0x3d, 0x71, 0x74, 0xbf, 0xa2, - 0xf1, 0xda, 0x2f, 0x29, 0x02, 0x9b, 0xea, 0x48, 0x2c, 0xaf, - 0xe7, 0xa9, 0xf5, 0x68, 0xab, 0x8f, 0x18, 0xb9, 0x7b, 0x28, - 0xf0, 0x92, 0xfb, 0x07, 0xd7, 0xbd, 0x43, 0xcd, 0x7f, 0xfc, - 0xb9, 0x5f, 0x24, 0xf8, 0x48, 0x2e, 0xbe, 0x42, 0x87, 0x80, - 0x38, 0x78, 0x9e, 0x8c, 0x52, 0x6d, 0xfa, 0x2e, 0x46, 0x35, - 0x7a, 0x59, 0x88, 0xb9, 0x3e, 0xcb, 0x79, 0xb4, 0x8a, 0x9e, - 0xd5, 0xd0, 0x30, 0x8c, 0xb2, 0x0c, 0x9d, 0x8d, 0x2d, 0x64, - 0x0b, 0xf6, 0xeb, 0xf1, 0xde, 0xea, 0x74, 0xfc, 0xbc, 0x01, - 0x18, 0x48, 0x4e, 0x35, 0x02, 0x83, 0x01, 0xb2, 0x50, 0xa0, - 0x44, 0x19, 0x30, 0x00, 0x12, 0x4a, 0xa0, 0x6d, 0x6b, 0x8b, - 0xf1, 0xce, 0xda, 0x2e, 0x16, 0x35, 0x52, 0x26, 0xf9, 0xbe, - 0xb1, 0x37, 0xfc, 0x0a, 0x8b, 0x6f, 0x06, 0x11, 0x7b, 0xf7, - 0xa8, 0x40, 0xbd, 0x8d, 0x94, 0xa4, 0xa2, 0xe0, 0xb6, 0xdf, - 0x62, 0xc0, 0x6f, 0xb3, 0x5d, 0x84, 0xb9, 0xaa, 0x2f, 0xc1, - 0x3b, 0xcb, 0x20, 0xc6, 0x68, 0x69, 0x15, 0x74, 0xbc, 0xdb, - 0x43, 0x9c, 0x4a, 0xfc, 0x72, 0xc1, 0xf5, 0x87, 0x80, 0xe8, - 0x6c, 0xd5, 0xc1, 0x2e, 0x34, 0x5e, 0x96, 0x76, 0x08, 0x3e, - 0x45, 0xe4, 0xa0, 0x4a, 0x7a, 0xc1, 0x67, 0x38, 0xf2, 0x31, - 0x1f, 0x7b, 0x0f, 0x54, 0xbd, 0x0d, 0x1f, 0x9e, 0x8e, 0x99, - 0x8b, 0x58, 0xd9, 0x94, 0x87, 0xaa, 0x8b, 0x82, 0x5d, 0x5e, - 0xe8, 0x50, 0xf4, 0xf2, 0xc7, 0xe9, 0x85, 0x6b, 0xd2, 0xef, - 0x13, 0xc1, 0xed, 0x57, 0x2a, 0xc5, 0xd6, 0x5d, 0xa4, 0x3b, - 0x29, 0xba, 0xab, 0x1b, 0xaa, 0x21, 0x41, 0xe9, 0xdc, 0x47, - 0x88, 0xef, 0x0c, 0xfc, 0xb2, 0xdc, 0xf7, 0xdb, 0x55, 0x4d, - 0x70, 0xc7, 0xe2, 0x8a, 0x8a, 0xe1, 0xde, 0xcf, 0xe5, 0xca, - 0x23, 0x36, 0x29, 0xe5, 0xfc, 0x54, 0x66, 0xda, 0xe9, 0xab, - 0x58, 0x20, 0xb2, 0x8e, 0xb2, 0x7d, 0x5d, 0xb8, 0xc7, 0x6c, - 0x48, 0x53, 0x2b, 0x47, 0xe0, 0x12, 0x00, 0x0e, 0xfe, 0xa5, - 0x93, 0x34, 0xf9, 0x3e, 0xa6, 0x3f, 0x56, 0xaa, 0x43, 0x65, - 0xbb, 0x5a, 0x70, 0x3e, 0x62, 0xac, 0x3f, 0x5b, 0x90, 0x02, - 0x50, 0x5d, 0x05, 0xa8, 0xd5, 0x67, 0x1a, 0x62, 0xec, 0xd4, - 0xde, 0x29, 0x04, 0xac, 0x6d, 0x15, 0x5d, 0xa0, 0xec, 0xf2, - 0x57, 0x13, 0x0e, 0x17, 0x96, 0x0c, 0x32, 0x6a, 0xc5, 0xe0, - 0xa8, 0xff, 0x85, 0xa4, 0xa3, 0xe3, 0x0e, 0x35, 0x5d, 0xd1, - 0x28, 0x84, 0xaa, 0xc4, 0x84, 0xcd, 0x25, 0x63, 0x85, 0x82, - 0x3e, 0x12, 0x30, 0x17, 0x57, 0x45, 0xb8, 0xb4, 0x34, 0x01, - 0x3a, 0xa2, 0x77, 0x61, 0xc8, 0x3d, 0x1f, 0xc5, 0x0e, 0x4a, - 0xbb, 0xf6, 0xa0, 0x5d, 0x79, 0x4b, 0xc8, 0xf3, 0x9c, 0x87, - 0x05, 0x2f, 0xea, 0x25, 0x28, 0x91, 0x69, 0x77, 0x7c, 0xba, - 0xea, 0x4a, 0x75, 0x2e, 0x2b, 0x17, 0x83, 0x50, 0x32, 0x43, - 0x4f, 0xcd, 0xf1, 0x77, 0xb1, 0x22, 0x0a, 0x8b, 0x69, 0x58, - 0x09, 0x35, 0x07, 0x6d, 0x61, 0x4a, 0x8d, 0x18, 0x65, 0x6e, - 0x9b, 0x62, 0x07, 0xd0, 0x6a, 0x92, 0x39, 0x05, 0x80, 0x14, - 0xfa, 0x1c, 0x93, 0x84, 0x0c, 0xb5, 0x8c, 0x41, 0x91, 0x4e, - 0x48, 0xf0, 0xf2, 0xba, 0x1d, 0x73, 0x2f, 0x1e, 0xa1, 0x55, - 0xc3, 0x02, 0x8c, 0xb1, 0xf2, 0x37, 0xa6, 0x9a, 0x6b, 0xcd, - 0x45, 0x2e, 0x08, 0x90, 0x26, 0x63, 0x91, 0xff, 0x22, 0x5e, - 0xcd, 0xae, 0x9b, 0x19, 0x1e, 0x10, 0x62, 0x4e, 0x1f, 0x2d, - 0x81, 0x69, 0x4f, 0x41, 0xe5, 0x94, 0xff, 0x7e, 0xcc, 0x15, - 0x36, 0x1e, 0x29, 0x59, 0x37, 0xe7, 0x64, 0x40, 0x17, 0x1a, - 0x32, 0xba, 0x01, 0x26, 0x30, 0x80, 0x60, 0x07, 0x86, 0x6e, - 0xd4, 0xb3, 0xe2, 0x44, 0x16, 0x33, 0xf2, 0x4c, 0x84, 0x0e, - 0xb1, 0x4a, 0xc7, 0x92, 0xa6, 0xa3, 0x42, 0x36, 0x05, 0x3e, - 0x74, 0xa8, 0xb1, 0xc5, 0x63, 0x59, 0x0d, 0x1e, 0x36, 0x45, - 0x2b, 0x36, 0x5e, 0xca, 0xab, 0x97, 0x49, 0xd3, 0xab, 0xae, - 0x63, 0x0a, 0xd1, 0x03, 0x57, 0x88, 0xa4, 0xa4, 0x3c, 0xda, - 0x15, 0x49, 0x1a, 0x5d, 0xe6, 0x5e, 0xb9, 0x82, 0x23, 0xc0, - 0x83, 0x96, 0xfe, 0x38, 0x0b, 0x80, 0x0e, 0xde, 0x22, 0xeb, - 0x5d, 0xe4, 0x56, 0x32, 0xbe, 0xe0, 0xc0, 0x6e, 0x69, 0x63, - 0x27, 0x4e, 0x00, 0x58, 0x80, 0x70, 0xd9, 0xcc, 0x4e, 0xae, - 0x6c, 0x5e, 0x6a, 0x43, 0x81, 0xfd, 0x45, 0xb2, 0xa4, 0x6c, - 0xf0, 0x9c, 0x66, 0x5c, 0x7d, 0x5c, 0x78, 0x55, 0x33, 0x4b, - 0x3c, 0x3b, 0x1d, 0x18, 0x58, 0x79, 0x6a, 0x02, 0xec, 0xce, - 0x53, 0x69, 0xc0, 0x17, 0xed, 0x57, 0xaf, 0x71, 0x5b, 0x42, - 0x1b, 0x49, 0xd8, 0xe8, 0x96, 0x80, 0xb6, 0x48, 0x1b, 0x7c, - 0xf8, 0x74, 0x1c, 0xb1, 0xc4, 0x10, 0xb7, 0xf4, 0x97, 0x7e, - 0x6b, 0x8f, 0x54, 0xba, 0x37, 0xb9, 0x35, 0x9e, 0x7b, 0x17, - 0x16, 0x9b, 0x89, 0x39, 0xae, 0x4f, 0x2e, 0x18, 0x65, 0xb4, - 0x76, 0x20, 0x9a, 0x58, 0xe2, 0x57, 0x6e, 0x1c, 0x3f, 0x8e, - 0x9a, 0xbb, 0xd8, 0xfc, 0x4c, 0xd6, 0x2d, 0xc1, 0xa6, 0x46, - 0xac, 0x13, 0x1e, 0xa7, 0xf7, 0x1d, 0x28, 0x3a, 0xf4, 0xd6, - 0x48, 0xfb, 0xe5, 0xb3, 0x84, 0x94, 0x47, 0x92, 0xae, 0x9a, - 0x58, 0xc5, 0xac, 0x23, 0x1b, 0xb5, 0xcd, 0x96, 0xd2, 0x5e, - 0xb2, 0x41, 0xfc, 0x9a, 0xae, 0x19, 0xf1, 0x7b, 0x4b, 0x53, - 0x1b, 0xfa, 0xa5, 0x0c, 0x49, 0x6d, 0xff, 0xf4, 0x51, 0x88, - 0x19, 0x04, 0xd9, 0x85, 0x8e, 0xe2, 0x3a, 0x62, 0x31, 0x5c, - 0x6e, 0xe8, 0x4d, 0x04, 0x1d, 0xd8, 0xc2, 0x7b, 0x51, 0xe7, - 0x59, 0xbc, 0x85, 0x5c, 0xc4, 0xcc, 0xad, 0xcb, 0x93, 0x69, - 0x18, 0xe4, 0x71, 0x9e, 0x63, 0x33, 0x99, 0xb6, 0x3b, 0x23, - 0x11, 0x17, 0x7a, 0x3d, 0x6f, 0xb9, 0x6b, 0xf1, 0xf2, 0xa7, - 0x03, 0xfd, 0xf0, 0xcd, 0x5b, 0xb5, 0xda, 0x9a, 0xd9, 0x95, - 0x02, 0x76, 0xd8, 0x38, 0xd3, 0xbd, 0xa0, 0x4a, 0x9a, 0xab, - 0x70, 0xde, 0xc6, 0xf9, 0xa5, 0x19, 0x9c, 0xc4, 0xf9, 0x07, - 0x4d, 0xea, 0x15, 0xc2, 0x91, 0x4d, 0x54, 0xa9, 0x2c, 0xca, - 0xdf, 0xaa, 0xd1, 0xc4, 0xc0, 0x18, 0x77, 0x28, 0x2a, 0x2c, - 0xc3, 0x7c, 0x26, 0xbd, 0xd8, 0x0d, 0x51, 0xa1, 0x4d, 0xad, - 0x76, 0x76, 0xaa, 0xa9, 0x45, 0x82, 0x4f, 0x76, 0xfb, 0x1a, - 0xd3, 0x71, 0x3c, 0x55, 0xa2, 0x5c, 0xe0, 0xd6, 0xda, 0x35, - 0xbe, 0x25, 0x23, 0x26, 0x51, 0xc6, 0xb4, 0xf3, 0x3e, 0x2c, - 0x54, 0x09, 0xc7, 0x6f, 0xa5, 0x08, 0x81, 0xba, 0x75, 0xda, - 0xcb, 0x4d, 0x05, 0xdd, 0xca, 0x93, 0x48, 0x30, 0xe8, 0x4a, - 0x1f, 0xfd, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x07, - 0x80, 0x25, 0x2f, 0xbc, 0x49, 0xf8, 0xb3, 0xa3, 0x32, 0xd6, - 0x35, 0x20, 0xca, 0x01, 0x49, 0x96, 0xa0, 0x81, 0x42, 0xde, - 0xc4, 0xdb, 0x0f, 0xd1, 0x99, 0xe6, 0xd4, 0x23, 0x2a, 0xa6, - 0x21, 0x13, 0xfe, 0x51, 0x27, 0xce, 0x18, 0x2a, 0xfa, 0x49, - 0x9f, 0xcd, 0x0c, 0x1f, 0xcf, 0x9e, 0x44, 0x27, 0x41, 0xdc, - 0x09, 0xcf, 0xef, 0x19, 0xf5, 0x57, 0x7f, 0x36, 0x5c, 0x99, - 0x7e, 0x03, 0x74, 0xfb, 0xa9, 0xb6, 0xde, 0xeb, 0xd1, 0x2b, - 0x5f, 0x12, 0x6a, 0xa9, 0x33, 0x2c, 0x2a, 0xba, 0xad, 0x8f, - 0xc2, 0x27, 0x57, 0x6a, 0xd7, 0x40, 0xf7, 0x4f, 0x4c, 0x9a, - 0xb0, 0x3a, 0x5d, 0x2e, 0xf9, 0xf1, 0xea, 0xbd, 0x82, 0xaa, - 0xbd, 0xe6, 0x19, 0x16, 0xd5, 0x03, 0x5e, 0x43, 0xfd, 0x88, - 0x71, 0xd5, 0xb7, 0x78, 0xbe, 0x80, 0x0f, 0xc9, 0x7f, 0x3a, - 0x8f, 0xe1, 0x44, 0xd4, 0x0f, 0xce, 0x26, 0xaf, 0x65, 0xe0, - 0xf5, 0x04, 0x53, 0x56, 0x97, 0x4f, 0xf4, 0xc1, 0x44, 0x8d, - 0xf7, 0x88, 0x55, 0x47, 0x16, 0xaf, 0x3f, 0x8e, 0x42, 0xdf, - 0xbc, 0x14, 0xc3, 0xe6, 0x9f, 0x0d, 0x69, 0x54, 0x5b, 0x7c, - 0x49, 0xcf, 0xbf, 0x42, 0x4f, 0xc7, 0x64, 0x8a, 0xe5, 0x84, - 0x87, 0x20, 0x9b, 0xfd, 0x70, 0x25, 0x38, 0xd3, 0xb4, 0x97, - 0x78, 0xf1, 0x4f, 0x3f, 0x0f, 0xbb, 0x9c, 0xa3, 0x17, 0xd5, - 0x4e, 0x4b, 0xac, 0x82, 0x9a, 0x73, 0xb7, 0xc5, 0xec, 0x10, - 0x7a, 0x7b, 0xdb, 0x77, 0x2c, 0xb1, 0xf3, 0x8f, 0xc3, 0xa5, - 0x31, 0x11, 0x32, 0x55, 0x35, 0xb5, 0x77, 0xd2, 0x62, 0x19, - 0x46, 0x92, 0x94, 0xbb, 0x61, 0x0f, 0x30, 0x94, 0x8a, 0xf6, - 0xf7, 0x30, 0xe0, 0xa2, 0x8c, 0x1b, 0xff, 0x8c, 0x29, 0x44, - 0xb4, 0xb7, 0xb6, 0x5f, 0x4d, 0x52, 0xc6, 0x07, 0xe1, 0x28, - 0x8c, 0xae, 0x88, 0x8a, 0x22, 0xbd, 0xd7, 0x36, 0xe4, 0x8f, - 0xd1, 0xeb, 0x65, 0x54, 0x19, 0x5f, 0xba, 0xfb, 0xfc, 0x91, - 0xa1, 0xa4, 0xb8, 0xa4, 0x2d, 0x85, 0x20, 0xc4, 0xe5, 0xa7, - 0x4e, 0xdb, 0xa4, 0xc5, 0xcc, 0x2f, 0x37, 0x41, 0x29, 0x47, - 0x15, 0xff, 0x04, 0x80, 0x08, 0x37, 0xce, 0xc5, 0xe3, 0x5a, - 0x3f, 0x83, 0xbb, 0x03, 0x9e, 0xfe, 0xec, 0xe4, 0x11, 0x41, - 0x12, 0x13, 0xf2, 0x00, 0xe5, 0x1a, 0x02, 0x49, 0xeb, 0xdb, - 0x57, 0xe4, 0xce, 0xa0, 0x3f, 0xfd, 0x3c, 0x73, 0x2b, 0x92, - 0x44, 0x79, 0x9e, 0x12, 0x4f, 0xfa, 0xe4, 0x53, 0x62, 0xf2, - 0xb0, 0xe2, 0x8a, 0xf0, 0x93, 0xa8, 0x1d, 0xee, 0x8d, 0x58, - 0x7a, 0x4c, 0x29, 0x91, 0x29, 0xc1, 0xa4, 0xd5, 0xe6, 0x37, - 0x1b, 0x75, 0x5b, 0xb6, 0x6b, 0x76, 0x2e, 0xcb, 0xbd, 0xa9, - 0xbe, 0x4c, 0x2e, 0x21, 0xa6, 0x38, 0xde, 0x66, 0x2f, 0x51, - 0xea, 0x4c, 0xba, 0x3f, 0x4a, 0xfe, 0x7a, 0x15, 0xb3, 0x72, - 0x26, 0xba, 0xcf, 0x9e, 0x1b, 0x03, 0xa6, 0xaa, 0x65, 0x68, - 0xd3, 0x8c, 0x15, 0x17, 0xe9, 0x11, 0x18, 0x3c, 0xb6, 0xf8, - 0x02, 0x54, 0x98, 0x49, 0xfa, 0x35, 0x3c, 0xcd, 0xac, 0xc8, - 0x2b, 0x1a, 0x63, 0x93, 0x03, 0x05, 0xa1, 0x41, 0xbe, 0x12, - 0xca, 0x15, 0x47, 0x72, 0x63, 0x77, 0x26, 0xd0, 0xe7, 0x8f, - 0x0d, 0x6e, 0x9c, 0xac, 0x07, 0xbe, 0x03, 0x22, 0xd0, 0x39, - 0x63, 0x8d, 0x9b, 0xc6, 0x20, 0x81, 0xb5, 0x67, 0x15, 0xf6, - 0xb0, 0xe3, 0xb9, 0x3e, 0xb7, 0x3f, 0x8f, 0x46, 0xc9, 0x74, - 0x10, 0x1e, 0x53, 0xf1, 0xd4, 0x30, 0x4d, 0x6e, 0x72, 0xb4, - 0x73, 0x1c, 0xb6, 0x79, 0x82, 0x60, 0x2e, 0x2a, 0x7d, 0x82, - 0x95, 0xb5, 0x7c, 0x4d, 0x44, 0xcb, 0xd8, 0x8a, 0x17, 0xe8, - 0x50, 0x29, 0xd8, 0x3a, 0xeb, 0x29, 0xc1, 0x83, 0x0f, 0xd9, - 0xaf, 0xcc, 0xfa, 0xea, 0x3a, 0x47, 0x5d, 0x33, 0x1f, 0xe8, - 0x33, 0x5b, 0x88, 0x8e, 0xdb, 0xd5, 0x1e, 0xaf, 0x4a, 0x5f, - 0xc0, 0xfa, 0xf0, 0xb5, 0xa3, 0x5b, 0xda, 0x38, 0xb7, 0x38, - 0x5e, 0xce, 0x81, 0x44, 0xf7, 0x66, 0x62, 0x64, 0x1d, 0x04, - 0xf0, 0x8a, 0x4f, 0xa2, 0x80, 0x76, 0x83, 0x23, 0x89, 0x61, - 0x6b, 0xc3, 0xb7, 0xee, 0xb5, 0x06, 0x33, 0xad, 0x63, 0x04, - 0x78, 0xc9, 0xde, 0x32, 0xde, 0xcf, 0x18, 0xb9, 0xb0, 0x3b, - 0xee, 0x0a, 0x58, 0xea, 0xad, 0xbc, 0x1e, 0x77, 0xa0, 0x93, - 0xf7, 0xae, 0x9e, 0xb6, 0x31, 0x59, 0x8e, 0xb1, 0x03, 0x8f, - 0xbb, 0xa4, 0x25, 0x0c, 0x2e, 0xd7, 0xe2, 0x62, 0x5c, 0xf1, - 0x68, 0xe9, 0x76, 0xd7, 0x23, 0x14, 0x45, 0xaf, 0xcb, 0x09, - 0x50, 0x05, 0x3f, 0xa0, 0xf9, 0xc3, 0x9e, 0x89, 0x05, 0xa8, - 0x3b, 0x54, 0x55, 0x32, 0x74, 0x91, 0x46, 0xc1, 0x2c, 0x96, - 0x7e, 0x60, 0xad, 0xfa, 0xbb, 0xcd, 0x09, 0x7b, 0x39, 0x10, - 0x82, 0x8a, 0xc0, 0x5a, 0x0d, 0xab, 0xb3, 0x71, 0x45, 0xad, - 0x39, 0x8e, 0xec, 0x4d, 0x91, 0x8d, 0xda, 0x8d, 0xfa, 0xb0, - 0xad, 0x44, 0x3c, 0xc9, 0x21, 0x56, 0x22, 0xfc, 0xd3, 0xba, - 0xb7, 0x3c, 0xe3, 0x8d, 0xda, 0x59, 0x34, 0x42, 0xdd, 0x04, - 0x5b, 0x8e, 0x2b, 0xc7, 0x94, 0xd5, 0x42, 0xe0, 0x4a, 0x6f, - 0x35, 0x5a, 0x27, 0x82, 0xd8, 0x82, 0x40, 0xee, 0x0f, 0xa6, - 0xef, 0xe4, 0x70, 0xe3, 0x30, 0xb7, 0x2d, 0xd4, 0xbb, 0x27, - 0xb2, 0xbf, 0xad, 0x49, 0x45, 0xbc, 0xeb, 0xbe, 0xb7, 0xd8, - 0xe3, 0xb1, 0xf3, 0xeb, 0x41, 0x20, 0x9b, 0x21, 0x54, 0xc3, - 0xa8, 0xaf, 0x9f, 0x20, 0x5c, 0x15, 0x8e, 0x25, 0xbc, 0xbc, - 0x69, 0x91, 0xfe, 0xda, 0xad, 0xe5, 0x37, 0x7d, 0xb0, 0x51, - 0x14, 0xae, 0x8f, 0x35, 0x15, 0x0a, 0xd4, 0x49, 0xa7, 0xd9, - 0x20, 0x70, 0xa4, 0xf2, 0xf4, 0x24, 0x66, 0x52, 0xd1, 0xa5, - 0x22, 0xea, 0x29, 0xd9, 0xb2, 0x82, 0x8d, 0x36, 0x66, 0x75, - 0x6e, 0xd5, 0x8c, 0x54, 0x08, 0x21, 0xf2, 0xee, 0x78, 0xc7, - 0x1f, 0x9c, 0x63, 0x5d, 0x88, 0x56, 0xd1, 0xa0, 0x80, 0x33, - 0x60, 0x55, 0x23, 0x72, 0xd6, 0xb0, 0x1a, 0x50, 0xde, 0x25, - 0x70, 0xb5, 0x77, 0x42, 0xf8, 0x19, 0x18, 0x15, 0x8f, 0xfd, - 0x0c, 0x6a, 0x46, 0x1f, 0xbf, 0xe7, 0x60, 0x91, 0xe7, 0xbb, - 0x25, 0x63, 0x66, 0xff, 0x11, 0x97, 0xbb, 0xfd, 0x3a, 0x17, - 0x94, 0x77, 0xb4, 0xc5, 0x21, 0xba, 0x30, 0x94, 0xdd, 0xe5, - 0xeb, 0x1d, 0x01, 0xba, 0xf9, 0xb0, 0x30, 0xdb, 0x11, 0x93, - 0xb7, 0xfa, 0x79, 0xe8, 0x5e, 0xb3, 0x39, 0xf4, 0x51, 0x68, - 0x31, 0xce, 0xe9, 0x0e, 0x93, 0xde, 0xff, 0xec, 0x27, 0xbd, - 0xa6, 0x1a, 0x4c, 0xe0, 0x92, 0x5c, 0xd4, 0x07, 0xd2, 0xa1, - 0xdd, 0x12, 0x83, 0xd2, 0x9a, 0x79, 0xb3, 0x3c, 0xfb, 0x07, - 0xe3, 0x18, 0x1a, 0xa3, 0x24, 0x80, 0xb4, 0xcc, 0xf4, 0xc6, - 0xa5, 0x6c, 0x25, 0xd7, 0x99, 0x1a, 0x30, 0xf0, 0xa9, 0xfc, - 0x2e, 0x83, 0x44, 0xac, 0x64, 0x76, 0x34, 0xb0, 0xa6, 0x6f, - 0x20, 0x5a, 0x14, 0xf2, 0x07, 0xa7, 0x6f, 0x4d, 0xab, 0xf5, - 0xfc, 0x9d, 0xd6, 0x3e, 0x82, 0x48, 0x31, 0x25, 0x47, 0xc9, - 0x0e, 0x1d, 0xdb, 0x98, 0x91, 0x56, 0xf5, 0xfe, 0x66, 0x8d, - 0x48, 0xf0, 0x4c, 0x6c, 0x2c, 0x96, 0x54, 0x43, 0xec, 0x76, - 0xf2, 0xe1, 0x76, 0x68, 0xc8, 0xe1, 0xde, 0x0d, 0x8e, 0x6f, - 0xfc, 0x15, 0xd5, 0x93, 0x92, 0xfe, 0xca, 0x9b, 0x30, 0x61, - 0x03, 0x0b, 0xca, 0x99, 0x2f, 0xd3, 0x15, 0xe9, 0x66, 0x81, - 0xbd, 0x56, 0x17, 0x14, 0x4a, 0x2e, 0xf1, 0x34, 0x84, 0x55, - 0x9d, 0xc0, 0x2b, 0xa7, 0x4a, 0xee, 0xf1, 0x7c, 0x67, 0xc7, - 0xf3, 0x08, 0x1e, 0x6d, 0x6b, 0x5b, 0xcc, 0x81, 0x91, 0x5c, - 0x94, 0x1a, 0x80, 0xda, 0x3a, 0xce, 0x36, 0x05, 0xb0, 0x7a, - 0xe8, 0xd0, 0xb4, 0x57, 0x9c, 0xf9, 0xea, 0xf3, 0x26, 0x1d, - 0xcb, 0xf8, 0xdd, 0x65, 0xaf, 0xf7, 0xcd, 0xf7, 0xa1, 0x3d, - 0xfc, 0x9a, 0x3b, 0x08, 0xb9, 0xfa, 0x3c, 0x16, 0x49, 0x4a, - 0xf1, 0xba, 0x4d, 0x31, 0xdd, 0x5e, 0x4f, 0x3d, 0x66, 0x22, - 0x1b, 0x08, 0x91, 0x7d, 0xc6, 0xaf, 0x15, 0x07, 0x3c, 0xa1, - 0xf7, 0x07, 0xfd, 0x3e, 0x90, 0xbb, 0x6f, 0x7a, 0xe9, 0xe1, - 0x2f, 0xb9, 0xee, 0x91, 0x8e, 0x18, 0xcc, 0x8d, 0x1d, 0x22, - 0xa0, 0xa0, 0x28, 0x25, 0xfc, 0xd4, 0x94, 0xd3, 0xaa, 0xcf, - 0xce, 0xd0, 0x85, 0x82, 0x6f, 0x20, 0x9f, 0x55, 0x0e, 0xe5, - 0x72, 0x0d, 0x17, 0x3e, 0x34, 0xc7, 0x2c, 0x0a, 0x14, 0x45, - 0x27, 0xe2, 0xc7, 0x2f, 0x86, 0xa1, 0x55, 0x3e, 0x78, 0x03, - 0xe9, 0x78, 0x2e, 0xd3, 0x99, 0xee, 0xa0, 0x14, 0xf8, 0xe3, - 0x6c, 0xeb, 0x3f, 0x9a, 0xf3, 0x15, 0xce, 0xd5, 0x76, 0xf6, - 0x3a, 0x86, 0x30, 0x76, 0xf9, 0x88, 0x30, 0xf5, 0x4a, 0x50, - 0x58, 0x80, 0xe9, 0xd9, 0xd4, 0xb9, 0x34, 0x42, 0xa6, 0x4e, - 0x9c, 0x1a, 0x07, 0x16, 0x9e, 0xee, 0xe4, 0x88, 0x04, 0x8e, - 0xa8, 0xe7, 0xcd, 0xe8, 0x47, 0x1e, 0x54, 0x45, 0xd2, 0x65, - 0xd8, 0xee, 0x4b, 0xbd, 0xd0, 0x85, 0xaa, 0xfb, 0x06, 0x53, - 0x91, 0x7e, 0xe0, 0x59, 0x20, 0x57, 0x6a, 0xee, 0xd8, 0x9f, - 0x77, 0x7f, 0xd7, 0x40, 0x63, 0xbb, 0x21, 0x75, 0x76, 0x11, - 0x27, 0xcf, 0x05, 0xbb, 0x41, 0x30, 0x98, 0xbf, 0xdc, 0x5f, - 0xc6, 0xa4, 0x1e, 0x30, 0xa1, 0x53, 0xd4, 0x36, 0x7f, 0x2e, - 0x86, 0xd7, 0xd9, 0x95, 0x29, 0xd5, 0x46, 0x18, 0x60, 0x27, - 0xe4, 0x6f, 0xcb, 0xf4, 0xe2, 0xfe, 0xff, 0x3e, 0xff, 0x15, - 0xc6, 0xf2, 0x31, 0xf9, 0x2a, 0xc8, 0x05, 0x4e, 0x7c, 0x2e, - 0x92, 0xc8, 0x41, 0x4f, 0x9e, 0x23, 0x21, 0x4d, 0x74, 0xf8, - 0xc3, 0x44, 0x39, 0xc2, 0x69, 0x4b, 0x2e, 0x76, 0x5e, 0x44, - 0x12, 0x65, 0x31, 0x98, 0xbe, 0x0a, 0x10, 0x11, 0x12, 0x2c, - 0x67, 0x3d, 0x85, 0x2e, 0xd3, 0x97, 0x54, 0x1e, 0xb6, 0xad, - 0xd9, 0x45, 0x11, 0x53, 0x04, 0x7c, 0x3f, 0xf4, 0xc9, 0xac, - 0x82, 0x1b, 0x84, 0xf4, 0x20, 0x6b, 0xf1, 0xf5, 0x72, 0x04, - 0x24, 0xc1, 0xd3, 0x42, 0x43, 0x52, 0x9d, 0x2d, 0xd3, 0x89, - 0x8e, 0xd8, 0x28, 0xb9, 0xa2, 0xb4, 0xed, 0xbc, 0x76, 0x87, - 0x55, 0x67, 0x39, 0xd9, 0xb7, 0x20, 0x6a, 0xec, 0xec, 0xb8, - 0x14, 0x51, 0x91, 0xb9, 0x96, 0x0f, 0x7a, 0x3a, 0x12, 0xde, - 0x14, 0x3b, 0x83, 0xcf, 0x41, 0x5b, 0x5d, 0xff, 0x33, 0x68, - 0xdb, 0x53, 0x64, 0x93, 0xb1, 0xc3, 0x8a, 0x46, 0xa8, 0x44, - 0x9c, 0x14, 0x12, 0x6c, 0x92, 0x6f, 0xae, 0xc3, 0x45, 0xb2, - 0xa1, 0x67, 0x81, 0x3c, 0x22, 0x47, 0xfd, 0xa4, 0x7a, 0x79, - 0xa8, 0x0a, 0xfb, 0x7a, 0x91, 0x6e, 0xe9, 0x53, 0xec, 0x98, - 0x82, 0x57, 0xad, 0x05, 0x38, 0x55, 0xc1, 0xce, 0x3a, 0x04, - 0x4d, 0x12, 0x72, 0x37, 0x4a, 0x36, 0x54, 0x3f, 0x67, 0x8a, - 0xee, 0xd9, 0xf3, 0x80, 0xd5, 0xd7, 0xb8, 0xfc, 0x6e, 0x4f, - 0x60, 0x2b, 0x5a, 0xa4, 0xc5, 0x05, 0xdb, 0xe5, 0x09, 0xe3, - 0xeb, 0xa2, 0x51, 0x33, 0x30, 0x96, 0x46, 0x01, 0x26, 0x8f, - 0x38, 0xc9, 0x97, 0x32, 0x2d, 0xb4, 0x59, 0x15, 0x15, 0x38, - 0x66, 0x66, 0xfe, 0xcb, 0xee, 0xc1, 0xf6, 0x4e, 0xb7, 0xdf, - 0x7b, 0x63, 0xe6, 0x3f, 0xe0, 0x1c, 0x97, 0xed, 0x86, 0xf3, - 0xd2, 0xad, 0x42, 0x29, 0x20, 0x28, 0xa6, 0x59, 0x58, 0x7d, - 0x8f, 0x5c, 0x43, 0x07, 0xd1, 0x7e, 0x83, 0xba, 0x9c, 0x1b, - 0xfe, 0x17, 0x9e, 0xc8, 0x09, 0x63, 0x9a, 0x2d, 0x61, 0x33, - 0x51, 0x46, 0x01, 0xa8, 0xe9, 0x43, 0x1e, 0x4e, 0xfe, 0x61, - 0x1a, 0x28, 0x11, 0x65, 0x70, 0x43, 0x9f, 0xfc, 0x21, 0x1d, - 0x76, 0x7b, 0x40, 0x08, 0x18, 0xd3, 0xe8, 0xc2, 0xe3, 0x8c, - 0xe7, 0x27, 0xc2, 0xec, 0xb0, 0x08, 0x3e, 0x6b, 0x8f, 0x77, - 0x6d, 0x9e, 0xa6, 0xab, 0xce, 0x9a, 0xf8, 0x8f, 0x77, 0xb3, - 0xf4, 0xe8, 0x8b, 0xe7, 0xd9, 0xa1, 0x95, 0x40, 0x6b, 0xca, - 0x21, 0x98, 0xff, 0xdc, 0xdc, 0x96, 0xc3, 0x08, 0x81, 0x72, - 0x9a, 0xdd, 0xe2, 0xcf, 0x95, 0x99, 0xa6, 0xa3, 0x5e, 0x9e, - 0x25, 0x60, 0xa3, 0xc3, 0x39, 0xf7, 0x54, 0x6c, 0xf2, 0x75, - 0xa9, 0x38, 0x12, 0x38, 0x4d, 0x42, 0xe8, 0xec, 0x13, 0x25, - 0xa0, 0xf8, 0x04, 0xb8, 0xf6, 0x66, 0x0b, 0x56, 0xe1, 0xfb, - 0x26, 0x03, 0xe6, 0xa5, 0xf1, 0x4d, 0x7f, 0xa5, 0x9d, 0x58, - 0x71, 0xd8, 0xc7, 0x6a, 0xbe, 0xdc, 0x90, 0x89, 0xb1, 0x36, - 0xb4, 0xb6, 0xb4, 0xbb, 0xaf, 0x6e, 0x43, 0x10, 0xa6, 0xea, - 0xee, 0x12, 0xcb, 0x08, 0x2c, 0x4e, 0x66, 0xf0, 0x1f, 0xf4, - 0xbf, 0xd3, 0xeb, 0x63, 0x48, 0xd0, 0xbe, 0x8a, 0xed, 0x24, - 0xdb, 0x0f, 0x23, 0x1d, 0x2e, 0x30, 0x97, 0x0f, 0xd8, 0xc6, - 0x3b, 0x04, 0x2f, 0x33, 0x78, 0x20, 0x6e, 0xb1, 0x33, 0x03, - 0x27, 0xac, 0x0a, 0x37, 0x15, 0x31, 0xef, 0x4d, 0x43, 0xcc, - 0xa0, 0x49, 0x80, 0xe3, 0x8c, 0xc0, 0xf3, 0xf7, 0x2d, 0x37, - 0x1d, 0xd3, 0x90, 0x5f, 0xad, 0x31, 0xb5, 0x95, 0x17, 0x69, - 0x4b, 0xec, 0x84, 0x9d, 0x2b, 0x8d, 0xdd, 0x9b, 0x58, 0x04, - 0xba, 0x28, 0x0e, 0x28, 0xc1, 0x54, 0x6c, 0xb0, 0x25, 0x0c, - 0x4f, 0x98, 0x47, 0xf7, 0x93, 0xc2, 0xae, 0x2f, 0x6d, 0x29, - 0x9c, 0x3d, 0xe3, 0xb5, 0xe3, 0x28, 0x43, 0x14, 0xe6, 0x92, - 0x4c, 0x79, 0x90, 0x59, 0x75, 0x77, 0x56, 0x43, 0xda, 0xac, - 0xa9, 0x42, 0xd7, 0xca, 0x95, 0x73, 0x26, 0x54, 0x1f, 0x3a, - 0x8a, 0x37, 0x64, 0xd7, 0xcf, 0xe1, 0x31, 0xf7, 0x40, 0x59, - 0xfd, 0xff, 0xea, 0x72, 0xfd, 0xc4, 0xde, 0xe3, 0x4d, 0x8a, - 0xf5, 0x80, 0xc0, 0x61, 0x21, 0xbd, 0xbd, 0x8e, 0x42, 0xd5, - 0x4c, 0xe4, 0xf4, 0x78, 0x31, 0xca, 0xf1, 0xec, 0x7c, 0x7b, - 0x85, 0x6a, 0x05, 0x54, 0xbe, 0x38, 0x54, 0x2f, 0x1f, 0xda, - 0x9f, 0x98, 0xe2, 0x79, 0xd7, 0x42, 0xca, 0xba, 0x85, 0x21, - 0xe2, 0xcb, 0x2b, 0xae, 0x4a, 0x4e, 0x35, 0xfb, 0xcf, 0x3d, - 0xc5, 0xae, 0x27, 0x30, 0xa9, 0x45, 0xe6, 0x3b, 0x43, 0x3e, - 0x35, 0xe3, 0xf2, 0x0d, 0x53, 0x32, 0x2b, 0xf6, 0xe6, 0xc7, - 0xd5, 0x02, 0x82, 0x03, 0xc1, 0x00, 0xd4, 0x04, 0x9b, 0xef, - 0x5d, 0x58, 0xb0, 0xa3, 0xaa, 0xd2, 0xab, 0x53, 0x65, 0x99, - 0x03, 0x49, 0x48, 0x4d, 0xf5, 0xdf, 0x5d, 0x16, 0x14, 0x11, - 0x60, 0x45, 0x1b, 0xff, 0x4a, 0x60, 0x2b, 0x37, 0x63, 0xf6, - 0xa7, 0x8a, 0xa8, 0xff, 0x08, 0x97, 0x08, 0xfc, 0xbb, 0xb3, - 0x20, 0xa3, 0xcd, 0xd9, 0x58, 0xdb, 0x16, 0x1b, 0x88, 0x02, - 0x1e, 0x0f, 0x43, 0x9b, 0x16, 0x7e, 0xbe, 0xb1, 0x9c, 0x13, - 0x10, 0xdc, 0xa1, 0x56, 0xff, 0xa3, 0xff, 0x5e, 0x69, 0x30, - 0xee, 0x7e, 0x76, 0x5f, 0x84, 0x94, 0xeb, 0x8f, 0x58, 0xf8, - 0xcf, 0xbb, 0x99, 0x6e, 0xf0, 0xd8, 0x32, 0xf6, 0xce, 0x48, - 0x6f, 0x7c, 0xc8, 0x8f, 0xd3, 0x86, 0x22, 0x49, 0x9f, 0xde, - 0x11, 0x05, 0xa4, 0xdc, 0x92, 0xfb, 0x0f, 0xfa, 0x09, 0x4d, - 0x17, 0x1a, 0xe2, 0x76, 0x67, 0x40, 0xa9, 0x5b, 0x1b, 0x54, - 0x66, 0x48, 0xf7, 0xc3, 0x59, 0xd4, 0xcf, 0x55, 0xd0, 0x7f, - 0x3b, 0xb0, 0xa2, 0xd8, 0xec, 0xb7, 0x88, 0xe7, 0xb0, 0x30, - 0x72, 0x42, 0x65, 0xe2, 0x91, 0xa7, 0x9b, 0xf6, 0x07, 0x45, - 0x52, 0x51, 0xaa, 0xbe, 0x32, 0x35, 0xe4, 0x88, 0x23, 0xe7, - 0xcb, 0x3c, 0x1c, 0xfb, 0x0b, 0x96, 0xd5, 0xb3, 0x92, 0x86, - 0x79, 0x5b, 0x47, 0x93, 0xd6, 0xbd, 0xc7, 0x21, 0x17, 0xd0, - 0xc9, 0xc7, 0x69, 0x84, 0x80, 0x98, 0xaf, 0x2c, 0x63, 0xd1, - 0xef, 0x6e, 0xca, 0x84, 0x30, 0x32, 0x83, 0x2d, 0x49, 0xbb, - 0x1f, 0x2a, 0xfe, 0x40, 0x7c, 0x03, 0xd4, 0x45, 0xdc, 0xfe, - 0x94, 0xf9, 0xe4, 0x36, 0x47, 0xfa, 0x7e, 0x2e, 0x93, 0x03, - 0xf8, 0x15, 0xf9, 0xce, 0xc3, 0x5b, 0x76, 0x10, 0xec, 0x89, - 0x8c, 0xce, 0x25, 0xa5, 0x77, 0x9a, 0xc5, 0x1e, 0xdd, 0x07, - 0x1b, 0x5b, 0xac, 0x6f, 0xdb, 0x94, 0x85, 0xdf, 0x02, 0x22, - 0xd1, 0xa9, 0x01, 0x8e, 0x63, 0xa1, 0xee, 0x94, 0x9c, 0xdb, - 0xb4, 0x1a, 0x43, 0xe1, 0x1f, 0x4e, 0x2f, 0x68, 0x50, 0x0c, - 0x2f, 0x5b, 0xc5, 0x1b, 0xe1, 0x8d, 0x4b, 0xe0, 0x63, 0x8d, - 0x7a, 0x30, 0xbe, 0xb7, 0x2e, 0x02, 0xc6, 0x02, 0xac, 0xa8, - 0xb8, 0x65, 0xc6, 0x28, 0xee, 0xe4, 0xec, 0x99, 0xa1, 0x9a, - 0xfd, 0x1f, 0xb5, 0x85, 0x7a, 0x94, 0x16, 0xe2, 0xe7, 0x74, - 0x06, 0x54, 0x1b, 0xd0, 0xaf, 0x58, 0x4e, 0x50, 0x7e, 0xd6, - 0xe4, 0x31, 0xd2, 0x0c, 0xd7, 0x9d, 0xe2, 0x00, 0x30, 0xbe, - 0x26, 0x30, 0x48, 0x99, 0x98, 0x58, 0x54, 0x5a, 0xc4, 0x0a, - 0x6c, 0xa1, 0x06, 0xe9, 0x38, 0xe6, 0x79, 0x39, 0x00, 0x9e, - 0xb6, 0xe3, 0xf7, 0x01, 0xcf, 0x2f, 0x82, 0x5e, 0xc3, 0x21, - 0x1b, 0x79, 0x93, 0xb5, 0xe4, 0x39, 0x9d, 0x32, 0x9d, 0x72, - 0xa4, 0xa8, 0xc9, 0x90, 0xce, 0xaf, 0xc0, 0x00, 0xad, 0x20, - 0x87, 0x26, 0xc7, 0xd3, 0x5f, 0x2e, 0xf0, 0x5e, 0xf8, 0x8b, - 0x85, 0xa3, 0xc6, 0x66, 0xd8, 0x2f, 0x86, 0xfe, 0x7d, 0x8d, - 0x22, 0xa5, 0x6d, 0x68, 0x3e, 0x87, 0x6e, 0xf7, 0xf1, 0xf0, - 0x07, 0xc4, 0xe3, 0xf1, 0x84, 0xc4, 0x93, 0x42, 0x06, 0x20, - 0x80, 0x64, 0xb3, 0x52, 0x5c, 0xa5, 0xcf, 0xee, 0xfe, 0xa4, - 0x09, 0x41, 0xbe, 0xaa, 0x78, 0x52, 0x76, 0x3f, 0xf7, 0xe8, - 0xa1, 0x6b, 0x0a, 0xbc, 0x22, 0xbe, 0xdf, 0x72, 0x7b, 0xea, - 0x90, 0x43, 0xee, 0xc2, 0x0b, 0x26, 0xdc, 0x02, 0x26, 0xa7, - 0x50, 0x04, 0x7a, 0x06, 0x91, 0xae, 0x93, 0xd5, 0xd2, 0xc9, - 0xa1, 0xe1, 0xfc, 0xb9, 0x8c, 0x94, 0xca, 0xa8, 0x1c, 0x2c, - 0x57, 0x97, 0x3e, 0x50, 0xed, 0x93, 0x45, 0x7a, 0x2c, 0x59, - 0x7b, 0x34, 0x8f, 0xcd, 0xd6, 0x17, 0x93, 0xd8, 0xde, 0xe8, - 0xb0, 0x9e, 0x27, 0x15, 0xc5, 0xbb, 0xa5, 0xbb, 0xc2, 0x30, - 0x9b, 0xc7, 0x27, 0x02, 0x18, 0xd8, 0xdb, 0xa4, 0x84, 0x37, - 0x64, 0xf7, 0xf7, 0xf1, 0xc8, 0x86, 0x4c, 0x64, 0x97, 0x08, - 0xe9, 0x4e, 0x0e, 0xb6, 0x92, 0xe9, 0x4c, 0x7b, 0x7f, 0xe1, - 0xcc, 0xa0, 0x71, 0xa7, 0x34, 0x48, 0x46, 0xbb, 0x37, 0xce, - 0xb0, 0x4d, 0x39, 0xa8, 0x0e, 0xab, 0xf6, 0x2f, 0x7c, 0x88, - 0xae, 0xcf, 0x90, 0xc6, 0x01, 0xd3, 0x5b, 0x37, 0xe9, 0xb1, - 0x28, 0x42, 0x14, 0xbf, 0x59, 0x35, 0x04, 0xab, 0x46, 0x6e, - 0xa8, 0x29, 0xe2, 0x7a, 0x77, 0x0e, 0x07, 0x67, 0xe4, 0x2b, - 0x03, 0xd2, 0x02, 0x36, 0x16, 0xd7, 0x81, 0x5d, 0x38, 0x9c, - 0x68, 0x9c, 0xf5, 0x9e, 0x49, 0x7d, 0x99, 0xfd, 0xcd, 0x1d, - 0xd2, 0xdf, 0x3c, 0x36, 0x19, 0x85, 0xaa, 0xb1, 0x30, 0x7a, - 0x21, 0xb1, 0x83, 0x16, 0xcf, 0xd1, 0x75, 0xa5, 0x9d, 0xd7, - 0xc1, 0x60, 0xa8, 0xdb, 0x1e, 0xb9, 0x3e, 0x9c, 0x12, 0x42, - 0xe8, 0x47, 0x49, 0x18, 0x9f, 0x5c, 0x12, 0xd1, 0x69, 0xd5, - 0x7d, 0xa8, 0x3c, 0xda, 0x35, 0x8a, 0x6c, 0x63, 0xb8, 0x62, - 0x8a, 0x61, 0xfa, 0xf2, 0x61, 0x11, 0x1e, 0xb6, 0xf3, 0x5c, - 0x62, 0x9d, 0xa7, 0x62, 0x0c, 0x87, 0x93, 0xe2, 0x23, 0x6c, - 0x3d, 0xa9, 0x2c, 0x4b, 0xd5, 0x7f, 0xfe, 0x72, 0x27, 0x36, - 0x06, 0xcb, 0x65, 0x38, 0xef, 0x13, 0x57, 0x6a, 0xc9, 0xc6, - 0x4f, 0x51, 0xd0, 0x90, 0x06, 0xa0, 0x23, 0x65, 0x95, 0xce, - 0x16, 0x8f, 0x8d, 0xb2, 0xf9, 0x7f, 0x3c, 0x2c, 0x30, 0x5a, - 0x38, 0xf1, 0x62, 0x79, 0x4b, 0xe5, 0xd7, 0x0a, 0x3f, 0x83, - 0x5f, 0x46, 0x26, 0x97, 0xb7, 0x08, 0x8c, 0x5b, 0xb8, 0x02, - 0x28, 0xf2, 0x4d, 0xdf, 0x93, 0x97, 0xc5, 0x94, 0x4b, 0x0e, - 0x42, 0xc3, 0x35, 0x91, 0x6b, 0x69, 0x61, 0x76, 0x7f, 0x94, - 0xcf, 0x0b, 0x81, 0x33, 0xff, 0xf3, 0x0c, 0xc7, 0x01, 0x94, - 0x94, 0xa9, 0xed, 0xcd, 0x4b, 0xc8, 0xcb, 0x91, 0xf9, 0x7a, - 0x47, 0xcd, 0x79, 0x3c, 0xa6, 0xde, 0x52, 0xd2, 0x47, 0x5c, - 0x10, 0x62, 0xbb, 0xe5, 0x32, 0xde, 0x83, 0xcf, 0xa8, 0x52, - 0xb3, 0xe7, 0xf9, 0xec, 0x17, 0x34, 0xbf, 0x33, 0x5d, 0xb2, - 0x4e, 0x56, 0xf7, 0x29, 0xd9, 0x5c, 0x1b, 0x83, 0x01, 0xbb, - 0xb9, 0x2b, 0x95, 0x52, 0x08, 0xab, 0xa4, 0x51, 0x03, 0xa1, - 0xfb, 0x6a, 0x50, 0xcd, 0xa8, 0x9d, 0x95, 0x6f, 0x7e, 0xb1, - 0x80, 0x1e, 0x9d, 0x81, 0x01, 0x26, 0x41, 0x78, 0x36, 0x3c, - 0x8a, 0x44, 0xf4, 0x98, 0x88, 0x1c, 0x5d, 0x06, 0xd3, 0xd2, - 0xb2, 0x58, 0x7d, 0xa1, 0x45, 0x1b, 0xbf, 0x8c, 0xf6, 0x6a, - 0xfa, 0xfd, 0x08, 0x29, 0x3e, 0x91, 0x57, 0xf1, 0x3d, 0x20, - 0xed, 0x49, 0x6e, 0x9c, 0x46, 0xd5, 0x08, 0x8d, 0x9b, 0xf8, - 0xef, 0xa3, 0x3a, 0x98, 0xcb, 0xb4, 0xcb, 0x5b, 0x30, 0x25, - 0x20, 0xcc, 0x04, 0xa1, 0xeb, 0xeb, 0xee, 0x1b, 0x36, 0x85, - 0xc1, 0x93, 0x16, 0x5a, 0x31, 0xdf, 0xd6, 0x0e, 0x73, 0x9e, - 0x63, 0x6e, 0x96, 0x90, 0x54, 0xd2, 0xc2, 0x53, 0x69, 0x93, - 0xd5, 0x54, 0xca, 0xd8, 0x84, 0xf7, 0x8f, 0x9a, 0xd1, 0x80, - 0x0d, 0x57, 0xa8, 0x26, 0xbe, 0x45, 0x64, 0xd5, 0x2b, 0xbb, - 0x45, 0xb5, 0x08, 0xb9, 0x37, 0x57, 0x02, 0x82, 0x03, 0xc1, - 0x00, 0xd1, 0x30, 0x2e, 0xb7, 0x9b, 0xe7, 0x5d, 0x13, 0x74, - 0x1f, 0x52, 0xf2, 0x02, 0x18, 0xe9, 0x07, 0x87, 0x9e, 0xed, - 0xde, 0x83, 0x92, 0xcf, 0x73, 0x61, 0x21, 0xc4, 0x62, 0x30, - 0x6c, 0xa2, 0x36, 0xbd, 0xe2, 0xc5, 0x19, 0xf6, 0xdf, 0x51, - 0x7b, 0xca, 0xd4, 0xe4, 0x51, 0x83, 0x49, 0x27, 0xdd, 0xbd, - 0xb0, 0x10, 0x79, 0x39, 0xdd, 0x0e, 0x3d, 0x65, 0xad, 0x6d, - 0xa3, 0x95, 0x52, 0x85, 0xdb, 0x18, 0x94, 0x60, 0xaa, 0xc0, - 0xc8, 0x8b, 0xdb, 0xfe, 0xf9, 0xf0, 0x86, 0xf9, 0x33, 0x8a, - 0xd7, 0xbe, 0x8d, 0x43, 0x83, 0x4d, 0xe4, 0x17, 0x2b, 0x46, - 0x54, 0x44, 0x1b, 0xbe, 0x52, 0x64, 0x47, 0x02, 0x6c, 0x4a, - 0x64, 0xb4, 0x3f, 0x21, 0x2f, 0xbb, 0xe3, 0x72, 0x7c, 0x26, - 0x14, 0xdf, 0x80, 0x50, 0xd4, 0x94, 0xe9, 0xc6, 0x7d, 0x71, - 0xd8, 0xaf, 0xfb, 0x74, 0x36, 0x33, 0xbe, 0x58, 0x63, 0xad, - 0xcb, 0xdf, 0xc0, 0x73, 0x9e, 0x19, 0xb0, 0x65, 0xe1, 0xd1, - 0x10, 0x44, 0xf1, 0xf0, 0x08, 0xa3, 0x09, 0x25, 0xeb, 0xd5, - 0xcb, 0xdd, 0x98, 0xdd, 0xbc, 0x09, 0x2c, 0xef, 0xc1, 0x8d, - 0x43, 0x15, 0x41, 0xc2, 0xa1, 0x84, 0x37, 0x70, 0x5a, 0xd5, - 0xf5, 0xb2, 0x6a, 0x1f, 0xbb, 0xcc, 0x30, 0xb9, 0xd9, 0xc7, - 0x36, 0x21, 0xf3, 0x69, 0x3e, 0x91, 0x38, 0x4d, 0xa5, 0xc4, - 0xf7, 0x84, 0x90, 0x34, 0x0e, 0x47, 0x7e, 0x26, 0xf2, 0x98, - 0x25, 0x26, 0xda, 0xf0, 0x4e, 0x55, 0xea, 0x4d, 0x9b, 0x8a, - 0x4a, 0xe1, 0x1f, 0xa0, 0x07, 0x90, 0x9e, 0x59, 0x64, 0xae, - 0xd9, 0xd6, 0x7e, 0x72, 0xa1, 0xc4, 0xea, 0x7d, 0xbd, 0x1f, - 0x7d, 0x2b, 0xd9, 0x2c, 0xdc, 0x8b, 0xc0, 0xda, 0x52, 0x0c, - 0xd1, 0xd0, 0x56, 0xb7, 0x93, 0xc7, 0x26, 0x79, 0x71, 0xd0, - 0x0d, 0xae, 0xaa, 0xa7, 0xe4, 0xc1, 0x59, 0x27, 0x68, 0x97, - 0x9a, 0xff, 0x3d, 0x36, 0x07, 0x55, 0x77, 0x07, 0x97, 0x69, - 0xf3, 0x99, 0x91, 0x3f, 0x63, 0xfd, 0x70, 0x8c, 0xa1, 0xeb, - 0xc5, 0x21, 0xa3, 0xfe, 0x99, 0x96, 0x11, 0x37, 0xb9, 0xe6, - 0x93, 0xf8, 0xd0, 0xb1, 0xa3, 0x57, 0x7a, 0xa8, 0x63, 0xdd, - 0x09, 0x56, 0xb0, 0x3b, 0xa6, 0x59, 0xc7, 0x89, 0x54, 0x16, - 0xe9, 0x2d, 0x78, 0x7d, 0xaf, 0x4e, 0x0a, 0x5b, 0x62, 0x3b, - 0x0b, 0xcb, 0x24, 0x89, 0x4e, 0x1c, 0x3d, 0xe1, 0xbd, 0x5a, - 0x3e, 0xc5, 0xfd, 0x15, 0x3d, 0x08, 0x38, 0x33, 0x5e, 0x37, - 0x4c, 0xe3, 0xe3, 0xe9, 0xc4, 0x1d, 0x2b, 0xd4, 0x58, 0x25, - 0x58, 0x23, 0x8e, 0xc6, 0x83, 0x9a, 0xf3, 0x9a, 0x78, 0xe9, - 0xa7, 0xca, 0xd7, 0xdd, 0x89, 0x20, 0x6e, 0x02, 0xea, 0x6b, - 0x37, 0x74, 0xda, 0xa0, 0xc2, 0x5a, 0x2b, 0x80, 0x1c, 0x28, - 0x91, 0x0d, 0x50, 0x64, 0xf0, 0x12, 0xe7, 0xc4, 0x7e, 0xdd, - 0x28, 0x3b, 0x26, 0x9a, 0xf4, 0x39, 0x56, 0xa4, 0x72, 0x4d, - 0xcb, 0x67, 0x3c, 0x68, 0xb2, 0x6f, 0xf0, 0xd0, 0x15, 0x90, - 0xc8, 0x08, 0xbb, 0x0b, 0x08, 0x6b, 0x8a, 0xde, 0x41, 0x57, - 0xbc, 0x63, 0x0e, 0x00, 0x8d, 0xf8, 0xdd, 0x93, 0xce, 0x58, - 0x7b, 0xa8, 0xb9, 0x64, 0x26, 0x06, 0xe7, 0x71, 0x23, 0x0f, - 0x41, 0xf1, 0xb7, 0xae, 0x59, 0x2e, 0xd0, 0x73, 0xc5, 0xd9, - 0xdc, 0x0e, 0x1c, 0x02, 0x58, 0x69, 0xb3, 0x15, 0x6d, 0x96, - 0x2b, 0xdb, 0x7b, 0x3b, 0x6c, 0x38, 0x32, 0x6b, 0xd8, 0x08, - 0xb2, 0xbd, 0xa7, 0x49, 0x43, 0xeb, 0x90, 0x42, 0x70, 0xc5, - 0xba, 0xcd, 0x4a, 0x44, 0x8f, 0x83, 0x0d, 0x17, 0x51, 0x5a, - 0x95, 0xa2, 0x57, 0x9a, 0x16, 0x19, 0x91, 0xbb, 0x90, 0x5c, - 0x2a, 0x16, 0xe8, 0x26, 0x10, 0x3c, 0xb7, 0x10, 0x5c, 0xf8, - 0xc5, 0x15, 0x2b, 0x70, 0x75, 0x69, 0xba, 0x7b, 0x3d, 0x0b, - 0x57, 0xac, 0x39, 0x12, 0x2e, 0xd6, 0xd9, 0x13, 0x74, 0x8e, - 0xa8, 0x0b, 0x17, 0xe1, 0x03, 0x7a, 0xba, 0x1d, 0x07, 0x91, - 0x8c, 0x2a, 0x3a, 0x8d, 0xe0, 0x2a, 0x94, 0xd4, 0x16, 0x35, - 0x64, 0x8b, 0x92, 0x2c, 0x2f, 0xa4, 0x18, 0xfe, 0x3f, 0x02, - 0x19, 0x8c, 0xb9, 0xeb, 0xaf, 0x01, 0x06, 0xa8, 0x37, 0x7f, - 0xe2, 0x44, 0x10, 0xce, 0xeb, 0x8d, 0xd0, 0x73, 0xc4, 0x1e, - 0x3d, 0x2c, 0xaf, 0x77, 0xb2, 0xef, 0xe5, 0x95, 0x8b, 0xdf, - 0x02, 0xfc, 0x93, 0xb8, 0xa9, 0x27, 0x88, 0x1d, 0x1d, 0x82, - 0x9f, 0xb6, 0xe4, 0x12, 0x05, 0x79, 0xb6, 0x1c, 0x41, 0x0d, - 0xc1, 0x53, 0x49, 0x8f, 0x3d, 0xc9, 0xad, 0x84, 0xcb, 0x0b, - 0x88, 0x7e, 0xfe, 0x73, 0x59, 0x21, 0x64, 0xc5, 0x50, 0x53, - 0xdc, 0x98, 0xc6, 0x43, 0xb8, 0xf5, 0xc3, 0xa1, 0xf5, 0xb2, - 0xd8, 0x86, 0xe9, 0xae, 0x98, 0xf9, 0x3b, 0x99, 0xc0, 0xe7, - 0xd7, 0x4a, 0xed, 0xac, 0x89, 0x84, 0xb0, 0x8e, 0xd3, 0xab, - 0xec, 0x03, 0x02, 0x12, 0x4b, 0x44, 0x17, 0x4d, 0x98, 0x26, - 0x1e, 0x51, 0xc5, 0xbb, 0xcd, 0xdc, 0x50, 0xab, 0x83, 0x37, - 0x49, 0x90, 0x1e, 0x34, 0xad, 0x81, 0x22, 0x6c, 0xe4, 0xdd, - 0x19, 0x01, 0x09, 0x25, 0x2d, 0x9e, 0x52, 0x90, 0x72, 0xa1, - 0x68, 0x3d, 0x0c, 0x49, 0x99, 0x19, 0x75, 0x5a, 0xca, 0x08, - 0x69, 0xa1, 0xd2, 0x88, 0x8c, 0xea, 0xcf, 0x9c, 0xbc, 0x23, - 0xad, 0x3f, 0xb9, 0xfc, 0xb9, 0x30, 0x0d, 0xd6, 0xd9, 0x65, - 0x0c, 0x7e, 0x99, 0x68, 0x35, 0x26, 0x07, 0xd1, 0x55, 0xbf, - 0x8e, 0xde, 0xe7, 0xe7, 0x01, 0xcb, 0xca, 0x0a, 0x39, 0x2e, - 0xcc, 0x19, 0xec, 0x77, 0xf3, 0xab, 0xb2, 0xe6, 0x0e, 0x54, - 0x06, 0x01, 0x50, 0x77, 0xd3, 0x61, 0x36, 0x05, 0x90, 0xe4, - 0xd8, 0xc4, 0x1d, 0xf5, 0xc7, 0xfa, 0x65, 0xf0, 0x46, 0x6a, - 0x5f, 0xa7, 0xc3, 0x8c, 0x6f, 0x04, 0x7f, 0xcf, 0x97, 0xb9, - 0x68, 0x92, 0x31, 0x09, 0x02, 0x9f, 0x22, 0xc9, 0xf8, 0xe6, - 0x7e, 0xa8, 0x95, 0x5b, 0x6b, 0xfe, 0x9c, 0x4e, 0x63, 0x2d, - 0x8c, 0x1a, 0x4c, 0x8b, 0x14, 0x79, 0x08, 0xd5, 0x96, 0x76, - 0xd1, 0xb4, 0x2f, 0xae, 0x5d, 0x91, 0x88, 0x7c, 0xdd, 0xd2, - 0x06, 0x86, 0xcf, 0x0a, 0x83, 0x6f, 0xda, 0xca, 0x71, 0x7c, - 0xe7, 0xe5, 0x34, 0xa8, 0x9a, 0x53, 0x8d, 0xa5, 0xaa, 0x5d, - 0xb5, 0x17, 0x81, 0x34, 0x6f, 0xbe, 0xbb, 0xb6, 0x58, 0x22, - 0x90, 0x80, 0xf6, 0x9c, 0x1c, 0xb0, 0x79, 0x8f, 0x92, 0x5b, - 0x7d, 0x1c, 0x71, 0x5f, 0xb4, 0x87, 0x36, 0xbe, 0x81, 0x8d, - 0x4a, 0xfc, 0x28, 0x72, 0x81, 0xaf, 0x5f, 0xbd, 0x5f, 0x99, - 0xe3, 0xc9, 0x37, 0xb0, 0x6e, 0xad, 0x70, 0x96, 0xfa, 0xe3, - 0x99, 0xf7, 0x08, 0x14, 0x21, 0x21, 0xb7, 0x1a, 0xaa, 0xe8, - 0x07, 0xb6, 0xfd, 0xa3, 0x7a, 0x2d, 0x93, 0x64, 0x8f, 0x89, - 0x2c, 0x71, 0x49, 0x71, 0xb8, 0x45, 0xca, 0xe0, 0x7c, 0x00, - 0x8d, 0xbd, 0xb8, 0x1c, 0x3a, 0x94, 0xa2, 0xa7, 0x6d, 0x0a, - 0x2e, 0x84, 0xaf, 0xbd, 0xab, 0x05, 0x95, 0x64, 0x8b, 0x05, - 0xc8, 0xc9, 0x4e, 0xea, 0xb5, 0x96, 0x4a, 0x47, 0xdd, 0xf2, - 0xcb, 0x02, 0x82, 0x03, 0xc0, 0x59, 0xb3, 0xd9, 0x85, 0xdc, - 0xa8, 0xb9, 0x93, 0x85, 0xa2, 0xbc, 0x79, 0xfc, 0x72, 0x50, - 0xc1, 0xa0, 0xa5, 0xdb, 0x71, 0x35, 0xa1, 0x31, 0xbc, 0x68, - 0x4e, 0xd5, 0x19, 0x9e, 0x0e, 0x32, 0x3a, 0xad, 0x40, 0x9e, - 0x82, 0x3c, 0x1e, 0x2b, 0x34, 0x3b, 0xc9, 0x32, 0x61, 0x07, - 0x5e, 0x46, 0xa9, 0xbe, 0xbe, 0x73, 0x0c, 0x12, 0xef, 0x52, - 0x68, 0x82, 0xe2, 0x0b, 0x12, 0x74, 0xfc, 0x10, 0x5c, 0xc0, - 0xb5, 0x98, 0x4d, 0x86, 0xbb, 0x8c, 0x40, 0x15, 0xa1, 0x6e, - 0x46, 0x73, 0x2e, 0xd6, 0x99, 0x6b, 0x50, 0xab, 0x04, 0x1a, - 0x5f, 0xf4, 0xfa, 0xcb, 0x4b, 0xad, 0xc4, 0x5e, 0x62, 0xa7, - 0x48, 0xd4, 0x52, 0x85, 0xdc, 0x2a, 0x85, 0x9b, 0xee, 0x08, - 0xa5, 0xaa, 0xaa, 0xe8, 0x44, 0xf0, 0xed, 0x89, 0x21, 0xe4, - 0xb4, 0xab, 0x3c, 0x0d, 0x53, 0x7e, 0x53, 0xdd, 0xac, 0x47, - 0xda, 0x77, 0x79, 0x5f, 0x78, 0x7a, 0x80, 0x84, 0x46, 0x50, - 0xaa, 0xdb, 0x3b, 0x8c, 0x6b, 0xda, 0xb0, 0xac, 0x0a, 0xd3, - 0x4c, 0xe4, 0x6e, 0x87, 0xd1, 0xb2, 0x5a, 0xd5, 0x98, 0xae, - 0xcb, 0x7e, 0xc2, 0x19, 0xdc, 0x53, 0x64, 0x86, 0x4c, 0x7b, - 0xe0, 0x63, 0x22, 0x94, 0x34, 0xad, 0x15, 0xdc, 0xd8, 0xa8, - 0x5f, 0xc6, 0x58, 0xf6, 0x72, 0x34, 0xdd, 0xfb, 0x85, 0x8a, - 0xd9, 0xa3, 0xfb, 0x3b, 0xad, 0x5d, 0xf0, 0x1a, 0x0b, 0xa8, - 0x91, 0xe7, 0x7d, 0x26, 0x27, 0x38, 0xf8, 0xe0, 0x49, 0x1b, - 0x56, 0xc5, 0x5b, 0xe3, 0x1c, 0x7b, 0xa3, 0x53, 0x6d, 0x22, - 0xfa, 0xd7, 0x63, 0x5f, 0xf0, 0xcb, 0x92, 0x49, 0x01, 0x54, - 0xe5, 0x77, 0x5b, 0xd3, 0xab, 0xce, 0xb8, 0x3a, 0x5b, 0xb8, - 0x07, 0x40, 0x46, 0x51, 0xe4, 0x59, 0xa2, 0x45, 0x41, 0xcc, - 0x81, 0x6c, 0xe3, 0xa6, 0xb3, 0xa0, 0x30, 0x4a, 0x67, 0x10, - 0xed, 0xc0, 0x8a, 0xcd, 0xfc, 0xa5, 0x44, 0x9b, 0x59, 0x19, - 0x4a, 0x43, 0x8d, 0xec, 0x00, 0xd8, 0x6d, 0xf9, 0xf0, 0x2d, - 0xd9, 0x55, 0xfc, 0x05, 0xe2, 0x12, 0x48, 0x4d, 0xd6, 0x7d, - 0xec, 0x41, 0xc4, 0x9e, 0xe2, 0xed, 0x84, 0x14, 0x29, 0x0e, - 0x5b, 0x81, 0x0b, 0xb0, 0x87, 0x8a, 0xd3, 0x35, 0x5c, 0xad, - 0xdb, 0xcc, 0xa1, 0x3c, 0xcb, 0x8b, 0x23, 0x55, 0x69, 0xf1, - 0x83, 0x84, 0x81, 0x36, 0xae, 0xd5, 0xf3, 0x98, 0xb6, 0xb2, - 0xb5, 0xa1, 0x79, 0x6d, 0x80, 0x8f, 0x2e, 0x25, 0x71, 0x4e, - 0x16, 0xff, 0xa0, 0x7c, 0xa4, 0x62, 0x8c, 0x44, 0x85, 0x64, - 0x90, 0x7c, 0xac, 0x10, 0x36, 0xf2, 0xf2, 0xfb, 0x20, 0x2b, - 0xa1, 0x27, 0xd0, 0xcc, 0x27, 0xfd, 0xb0, 0xba, 0x3e, 0x37, - 0xb1, 0xa8, 0x9d, 0x3c, 0x82, 0x63, 0xd0, 0x16, 0x6d, 0x7a, - 0xdd, 0x2e, 0xea, 0xe5, 0x87, 0xd6, 0x64, 0x72, 0xdb, 0x60, - 0x53, 0x38, 0x18, 0x66, 0x1d, 0x25, 0xf6, 0x08, 0x92, 0x7f, - 0x68, 0x5b, 0x79, 0x07, 0xde, 0x93, 0xee, 0xf8, 0x8f, 0xce, - 0x28, 0xcf, 0xb1, 0x5b, 0x43, 0x51, 0xdf, 0xf5, 0xac, 0xe8, - 0x9c, 0x95, 0x14, 0x8a, 0x67, 0xe1, 0x25, 0xfe, 0x11, 0xa2, - 0x40, 0xf8, 0xdd, 0xcf, 0xf5, 0x17, 0x94, 0xb6, 0x88, 0x10, - 0xa2, 0x90, 0x58, 0xef, 0xaf, 0x73, 0xf8, 0x7c, 0x9b, 0x20, - 0x30, 0x79, 0xca, 0x3f, 0xa9, 0x22, 0x40, 0xfd, 0xcc, 0xb0, - 0x5d, 0x0d, 0x97, 0x6b, 0xc0, 0x75, 0x35, 0x33, 0xc5, 0x76, - 0x45, 0x6e, 0x9b, 0x78, 0xe7, 0xb4, 0x04, 0xb3, 0xba, 0x3b, - 0x93, 0xb1, 0xa9, 0x8f, 0xa1, 0x24, 0x5d, 0x1c, 0x0e, 0x66, - 0xc0, 0xc6, 0xcc, 0xd6, 0xb7, 0x88, 0x9d, 0xb8, 0x45, 0xe3, - 0xaa, 0xc9, 0x6c, 0xfd, 0x37, 0xdc, 0x85, 0xd5, 0x49, 0xfd, - 0xef, 0xeb, 0xf9, 0x7a, 0x3f, 0x7a, 0x4f, 0x86, 0x49, 0xaa, - 0x9f, 0x08, 0x12, 0x0b, 0x11, 0x35, 0x5c, 0xd5, 0xd3, 0xda, - 0x14, 0x50, 0x03, 0x2c, 0x24, 0x26, 0x0e, 0x29, 0x18, 0xcc, - 0x1d, 0x0a, 0x7c, 0x94, 0x8b, 0xc0, 0xa0, 0x3f, 0xea, 0xf8, - 0xf8, 0xa9, 0x1d, 0x65, 0x31, 0x6f, 0x3b, 0xa6, 0xd0, 0xfc, - 0x26, 0xb0, 0x4e, 0x3a, 0x66, 0xe7, 0x32, 0x10, 0x2e, 0x84, - 0x47, 0xad, 0xa9, 0x18, 0xfc, 0xa3, 0x8b, 0x74, 0x84, 0x4f, - 0xd4, 0x25, 0x93, 0x0f, 0xdb, 0x2e, 0xae, 0x88, 0x8e, 0x28, - 0xf8, 0x0f, 0xaa, 0x60, 0xd4, 0xbe, 0xad, 0x66, 0x0c, 0x0d, - 0x01, 0xbd, 0x8d, 0xc4, 0xfc, 0x48, 0xef, 0x78, 0x14, 0x34, - 0xee, 0xb3, 0xbc, 0xd4, 0xbb, 0x1f, 0x7c, 0x12, 0x5c, 0x9b, - 0xeb, 0x77, 0x3e, 0x2c, 0x6e, 0x31, 0x59, 0xe6, 0x78, 0xc5, - 0xe8, 0xa4, 0xdd, 0xf1, 0xef, 0x5d, 0x27, 0x45, 0x31, 0x13, - 0xd0, 0x21, 0xa1, 0x13, 0xce, 0xac, 0x7e, 0xbb, 0xfb, 0x32, - 0xeb, 0x76, 0x31, 0xc4, 0xba, 0xdf, 0xfb, 0x5a, 0x1b, 0xc9, - 0x9e, 0x74, 0xa0, 0x9e, 0x26, 0x82, 0xd5, 0x6e, 0x1d, 0xc3, - 0x0e, 0xd1, 0x6d, 0xdb, 0x43, 0xb3, 0x0b, 0x14, 0xcb, 0xf1, - 0xad, 0x62, 0x34, 0x49, 0xb8, 0xd3, 0x08, 0xca, 0x93, 0xf1, - 0x42, 0xb2, 0x4b, 0x23, 0x79, 0x93, 0xde, 0x18, 0x58, 0xf3, - 0x66, 0xfa, 0xdc, 0xab, 0xca, 0x33, 0x22, 0x2b, 0x5c, 0x8c, - 0x12, 0xc1, 0x7b, 0x2e, 0x52, 0x72, 0xa7, 0x78, 0x4a, 0x49, - 0xa1, 0x53, 0x02, 0x76, 0x2d, 0x2e, 0xf8, 0x43, 0x3c, 0xe8, - 0xfa, 0xb7, 0xff, 0x39, 0xed, 0x74, 0x9e, 0x11, 0x61, 0x33, - 0xde, 0x2a, 0x55, 0xe6, 0x4a, 0xe7, 0x97, 0xa6, 0xb2, 0xc3, - 0x40, 0x41, 0x52, 0x66, 0xcf, 0xbf, 0xf8, 0x8e, 0x08, 0xea, - 0x96, 0x4d, 0x03, 0xc9, 0xbe, 0x3c, 0x4e, 0x36, 0x8c, 0x6f, - 0x4d, 0x1e, 0xcd, 0x31, 0x6d, 0x53, 0xea, 0x9e, 0xf0, 0x8e, - 0x35, 0x97, 0x37, 0x54, 0xe9, 0x0f, 0xb8, 0x23, 0x25, 0x69, - 0x5b, 0xb5, 0xff, 0xc3, 0x5a, 0x2d, 0x10, 0x6a, 0xc0, 0xb8, - 0xee, 0x0d, 0x31, 0x5b, 0xe4, 0x69, 0x40, 0x62, 0xa7, 0x1b, - 0x16, 0xfa, 0xd6, 0xb8, 0xba, 0xc8, 0x6a, 0xa3, 0x29, 0xdd, - 0x9b, 0x4d, 0xd7, 0x96, 0xef, 0x31, 0x74, 0xac, 0x37, 0x10, - 0x91, 0x30, 0x0c, 0x15, 0x3f, 0x09, 0xb6, 0x7d, 0x22, 0xfb, - 0x8c, 0x6f, 0xc3, 0x93, 0xa3, 0x98, 0xa6, 0x23, 0xa4, 0x55, - 0xe0, 0x9e, 0x23, 0x06, 0xa9, 0x78, 0xe9, 0xb3, 0x88, 0xc9, - 0xb7, 0x83, 0x05, 0x46, 0x11, 0x3a, 0x0a, 0xb9, 0x74, 0x5b, - 0xa0, 0xb5, 0x06, 0x96, 0x86, 0xb6, 0xf4, 0x9d, 0x0d, 0x86, - 0x43, 0xa8, 0x40, 0x4b, 0x08, 0x93, 0x7c, 0xad, 0xb0, 0x50, - 0xb4, 0xd0, 0xe7, 0xad, 0xd0, 0x54, 0x5e, 0x15, 0xaf, 0xad, - 0x34, 0x12, 0x86, 0xb3, 0x29, 0x3b, 0x20, 0xc9, 0xad, 0xeb, - 0xc2, 0x65, 0xf3, 0x5c, 0x2d, 0xe5, 0xff, 0xfd, 0x81, 0x79, - 0xf5, 0x11, 0x6f, 0xf7, 0xca, 0x0c, 0x76, 0xf0, 0xd4, 0x02, - 0x9d, 0xb7, 0x76, 0x39, 0x6d, 0x32, 0x6a, 0xb8, 0x30, 0xa4, - 0x01, 0xcc, 0x10, 0xef, 0xb1, 0x0e, 0x41, 0x22, 0x82, 0x5b, - 0x22, 0xcb, 0x32, 0x19, 0x2e, 0xa3, 0x0a, 0xce, 0x05, 0xdd, - 0xe8, 0x4a, 0x58, 0x92, 0xe1, 0x02, 0x82, 0x03, 0xc0, 0x22, - 0x0f, 0x95, 0x5b, 0xc2, 0x1f, 0xde, 0xf0, 0xde, 0xf4, 0x86, - 0xbd, 0xef, 0x07, 0x7d, 0x52, 0x03, 0x8c, 0x26, 0x31, 0x17, - 0xfd, 0x5c, 0x97, 0xed, 0xd5, 0xe0, 0xb3, 0x18, 0x2d, 0x68, - 0x10, 0x3f, 0xc4, 0xdf, 0xd1, 0x05, 0x78, 0x81, 0x3d, 0x05, - 0xde, 0xba, 0x3a, 0x67, 0x85, 0x0e, 0xdf, 0xb5, 0x16, 0x28, - 0xe8, 0x84, 0x3a, 0x71, 0x2a, 0x20, 0x17, 0x28, 0x05, 0xfd, - 0xb7, 0x4d, 0x22, 0x4a, 0x93, 0x46, 0x56, 0x27, 0x43, 0xc0, - 0x3a, 0x16, 0xff, 0x3d, 0x61, 0xcc, 0xcb, 0xce, 0xac, 0xa8, - 0x53, 0x3a, 0x0d, 0xf4, 0x2d, 0xd2, 0x73, 0xf2, 0x64, 0xa0, - 0x1e, 0x60, 0x53, 0xec, 0x0d, 0xff, 0xe0, 0x00, 0x10, 0xfb, - 0xa4, 0x57, 0xd3, 0xfc, 0xe4, 0xe0, 0xec, 0x44, 0x0b, 0x1c, - 0x05, 0x39, 0xa4, 0x13, 0x87, 0x29, 0x11, 0x9d, 0xea, 0xe9, - 0x64, 0xa9, 0x1c, 0x76, 0x3a, 0x65, 0x0b, 0xfd, 0xed, 0x77, - 0x46, 0x4f, 0xcd, 0x0b, 0x63, 0xc4, 0x83, 0x0b, 0x56, 0x79, - 0xd3, 0x67, 0x01, 0x11, 0x02, 0xd9, 0x50, 0xd8, 0x23, 0xf4, - 0xb6, 0x02, 0x4c, 0xae, 0xb5, 0xc9, 0x68, 0x1b, 0x87, 0x33, - 0xbb, 0xdc, 0x64, 0x0e, 0x32, 0x34, 0xb2, 0x25, 0xaa, 0x76, - 0xdd, 0x7e, 0xc3, 0x46, 0x51, 0x1c, 0xc1, 0xd0, 0x05, 0x09, - 0x6c, 0x27, 0xd3, 0xcf, 0x33, 0x7a, 0xb9, 0x26, 0x24, 0x23, - 0x4a, 0x93, 0x9f, 0x4b, 0x96, 0xc7, 0xe2, 0xb2, 0x51, 0x42, - 0x4d, 0x5d, 0xd9, 0x73, 0x75, 0xce, 0x23, 0x28, 0x56, 0x5e, - 0xe7, 0x96, 0x58, 0x04, 0xfd, 0x33, 0x93, 0x08, 0x41, 0x62, - 0x02, 0x7e, 0xc9, 0xc6, 0x55, 0x64, 0x19, 0xda, 0x39, 0xb8, - 0x5d, 0x09, 0x47, 0xf3, 0xdd, 0x77, 0xee, 0xea, 0x35, 0x73, - 0x95, 0xdb, 0x18, 0x4d, 0xd1, 0xfe, 0xee, 0x40, 0x31, 0x2a, - 0x22, 0x91, 0x69, 0xd6, 0xed, 0x9c, 0x54, 0x14, 0x73, 0x61, - 0x61, 0xe7, 0x1d, 0x34, 0x96, 0x47, 0xff, 0x28, 0x7a, 0x48, - 0xa3, 0xf4, 0xcd, 0x64, 0x23, 0xe2, 0x52, 0x2f, 0x20, 0x8f, - 0x04, 0xb3, 0xdc, 0xf0, 0x29, 0x67, 0x88, 0x76, 0x79, 0xdb, - 0x86, 0xa7, 0x95, 0xf0, 0x15, 0x81, 0xbb, 0x98, 0xee, 0xff, - 0x55, 0x7c, 0xb0, 0xee, 0x67, 0x65, 0xfd, 0xf2, 0x29, 0x0f, - 0x85, 0x51, 0xf9, 0xac, 0x5c, 0x55, 0x5a, 0xde, 0x40, 0x62, - 0x58, 0x55, 0x9f, 0x09, 0x4c, 0x2e, 0x28, 0x75, 0xbc, 0x48, - 0xe2, 0x97, 0x85, 0xb3, 0x83, 0xeb, 0x21, 0x49, 0x21, 0xd4, - 0xed, 0x74, 0x4f, 0xc1, 0x6c, 0x34, 0x8c, 0x11, 0xb0, 0x93, - 0x41, 0x99, 0x23, 0x2e, 0xa4, 0xc1, 0x9f, 0x34, 0x74, 0x64, - 0xbb, 0xd7, 0x4f, 0x8f, 0x9f, 0x3a, 0x0c, 0x4f, 0x5e, 0xdd, - 0x41, 0x07, 0xf1, 0xfd, 0x5a, 0x9d, 0xe6, 0x77, 0xd8, 0x7e, - 0x71, 0x7b, 0xad, 0xf7, 0x76, 0x13, 0x71, 0x90, 0xb3, 0x0f, - 0x46, 0x8e, 0xee, 0x7b, 0x33, 0x97, 0x5d, 0x21, 0x3b, 0xa0, - 0x58, 0x9e, 0xb7, 0x87, 0x30, 0x8f, 0xc1, 0x23, 0x2c, 0xde, - 0xf7, 0x0d, 0xa9, 0xd6, 0x50, 0xeb, 0x35, 0x7a, 0x82, 0xab, - 0x22, 0x49, 0x86, 0xd4, 0x61, 0xc7, 0xc2, 0x4e, 0x77, 0xfc, - 0x16, 0x0b, 0xaf, 0x81, 0x6a, 0x47, 0xea, 0xac, 0x7e, 0x51, - 0x4c, 0x56, 0x30, 0x21, 0x46, 0x41, 0xc3, 0x92, 0x60, 0x99, - 0x4f, 0x88, 0x36, 0x3b, 0x27, 0xb4, 0xb2, 0x7e, 0x44, 0x2f, - 0xdd, 0x95, 0xe4, 0x5e, 0x16, 0x1f, 0xa7, 0x32, 0x6b, 0x60, - 0x24, 0x0f, 0xf2, 0xe6, 0x35, 0x3c, 0x0c, 0x3e, 0xb5, 0xd6, - 0xdd, 0x63, 0xe2, 0x76, 0x35, 0x38, 0x79, 0xbf, 0xa5, 0x23, - 0xa4, 0xdd, 0xeb, 0x01, 0x48, 0xd0, 0x60, 0x86, 0x11, 0x38, - 0x5f, 0x9e, 0x6b, 0x00, 0x67, 0xd2, 0x5b, 0x41, 0x0a, 0x5e, - 0x13, 0x0f, 0xa1, 0x9e, 0x90, 0x85, 0xa6, 0x7f, 0xe5, 0x4b, - 0x9e, 0x93, 0x4e, 0x5b, 0x1f, 0x47, 0x62, 0xb0, 0x23, 0xbe, - 0x82, 0xa9, 0xd9, 0xb6, 0x2e, 0xfd, 0xb1, 0x10, 0xca, 0xe0, - 0xc9, 0x5d, 0xf6, 0x85, 0x18, 0x6c, 0x9c, 0x1d, 0x1f, 0x7c, - 0xf6, 0x55, 0x09, 0x80, 0xcf, 0xac, 0xfe, 0x37, 0x6a, 0x4f, - 0x96, 0xaa, 0x40, 0x79, 0x8b, 0x4a, 0xf2, 0x96, 0x79, 0x12, - 0x1a, 0x26, 0x87, 0x06, 0x35, 0x4d, 0xd4, 0x3e, 0x14, 0x39, - 0xe5, 0x6c, 0x39, 0x0f, 0x84, 0xb3, 0x5f, 0xed, 0xf4, 0xff, - 0x89, 0x52, 0x05, 0x00, 0xf1, 0xd1, 0xc3, 0xcf, 0x54, 0x10, - 0x24, 0x7c, 0xa6, 0xb5, 0x95, 0xa8, 0x6e, 0x13, 0x3e, 0x4a, - 0x40, 0x6c, 0xf9, 0x63, 0x90, 0x44, 0x52, 0x07, 0x53, 0xb7, - 0x51, 0xd9, 0x18, 0x47, 0x2e, 0xb0, 0x4e, 0x0f, 0x09, 0x99, - 0x3a, 0x97, 0x26, 0x53, 0xa6, 0x02, 0x06, 0x0e, 0x93, 0xe1, - 0x0b, 0xc5, 0xa9, 0x14, 0xd3, 0xd6, 0x8a, 0x29, 0x75, 0xcd, - 0xb6, 0x7b, 0x64, 0x7c, 0xdd, 0x7e, 0xb4, 0x0a, 0x87, 0x48, - 0x4a, 0x1b, 0x0e, 0x74, 0x4c, 0xd3, 0x0e, 0x96, 0x0e, 0x53, - 0xc4, 0x3d, 0x7b, 0x1c, 0x87, 0x6a, 0x15, 0xd8, 0x77, 0xba, - 0xe6, 0xa0, 0x2f, 0x2c, 0x1a, 0x9d, 0xde, 0x79, 0xfd, 0xab, - 0x44, 0x80, 0xf0, 0x37, 0x9a, 0x3b, 0xf8, 0xde, 0x3d, 0x29, - 0xcb, 0x89, 0x64, 0x4b, 0x57, 0xe7, 0x6b, 0x84, 0x09, 0x27, - 0x17, 0x2f, 0xb2, 0xba, 0x3d, 0x09, 0xc9, 0x3c, 0x89, 0xe6, - 0x19, 0x73, 0x83, 0xf7, 0xc6, 0x19, 0x18, 0x96, 0xb2, 0x7d, - 0x1e, 0x9f, 0x70, 0x1f, 0xfc, 0x1f, 0xe2, 0xb5, 0x69, 0x1e, - 0xf4, 0x65, 0x91, 0xce, 0x4b, 0xdc, 0x74, 0x49, 0x21, 0x64, - 0x8b, 0x33, 0x50, 0xd2, 0xc1, 0x33, 0x62, 0x5b, 0xde, 0x0a, - 0x72, 0xbe, 0xc0, 0x05, 0x51, 0x15, 0x80, 0xed, 0x32, 0x3a, - 0x64, 0xa2, 0x73, 0x68, 0x5b, 0x16, 0xcf, 0x70, 0x5c, 0x98, - 0xe5, 0x67, 0x45, 0x60, 0x57, 0x2b, 0x47, 0x0a, 0x22, 0x73, - 0xc3, 0x56, 0x33, 0x3e, 0x14, 0x1d, 0x0c, 0xd1, 0x03, 0x08, - 0x92, 0x21, 0x2b, 0xa9, 0x6e, 0x6b, 0xf9, 0x0c, 0x1e, 0x86, - 0xdd, 0xb5, 0xbb, 0xa4, 0xa5, 0x82, 0x99, 0x98, 0x49, 0x36, - 0xec, 0x98, 0x98, 0x95, 0xac, 0xc2, 0xa0, 0x1f, 0xa5, 0x7e, - 0x67, 0xd1, 0xcf, 0x6a, 0xf4, 0x16, 0x08, 0x7a, 0x8d, 0x0b, - 0xae, 0x12, 0x51, 0xe6, 0x8e, 0xe6, 0xcd, 0xa1, 0xaa, 0x6d, - 0xe4, 0x54, 0xd4, 0x69, 0x1b, 0x09, 0x6a, 0xba, 0x5e, 0x0b, - 0x11, 0x9c, 0x83, 0xb3, 0x5c, 0x67, 0xbb, 0x2d, 0xf8, 0x66, - 0x1c, 0x33, 0xb8, 0x22, 0x58, 0x10, 0x96, 0xe9, 0x99, 0xaf, - 0x0b, 0x2a, 0xf1, 0xe0, 0xcb, 0x56, 0xfb, 0x6d, 0x04, 0x40, - 0xec, 0x37, 0x67, 0x1e, 0x08, 0x7a, 0x1c, 0xe9, 0xd8, 0x54, - 0xf7, 0xd4, 0xc7, 0x3c, 0x45, 0x23, 0x2b, 0x76, 0xd2, 0x62, - 0xc2, 0x53, 0xce, 0xfe, 0x02, 0xc4, 0xd9, 0xf6, 0x3c, 0xed, - 0x49, 0x47, 0x21, 0xf9, 0x03, 0x3a, 0xa0, 0x16, 0x3a, 0xfe, - 0x0c, 0x2f, 0x54, 0x7e, 0x85, 0x29, 0x7b, 0xc0, 0xaf, 0xa8, - 0x5d, 0x31, 0x25, 0xda, 0xa7, 0xe3, 0x92, 0x1b, 0x64, 0x01, - 0x1b, 0x3f, 0x6e, 0x47, 0xc5, 0x5a, 0x84, 0x52, 0x17, 0x02, - 0x82, 0x03, 0xc1, 0x00, 0x81, 0x99, 0x2e, 0x72, 0x41, 0x6e, - 0x86, 0xeb, 0x6f, 0x42, 0xd1, 0x38, 0x6e, 0xaa, 0x1a, 0xd5, - 0x0a, 0xad, 0x51, 0xb1, 0xce, 0xd6, 0x35, 0xbe, 0x34, 0xd8, - 0xc1, 0xe4, 0x5f, 0xdf, 0x2e, 0xe4, 0x90, 0xf2, 0x61, 0x21, - 0x46, 0xc6, 0xfe, 0xab, 0x0f, 0x6c, 0x97, 0x78, 0xcd, 0x55, - 0x86, 0x83, 0x61, 0x99, 0x49, 0x14, 0x86, 0xc6, 0x86, 0xf1, - 0x41, 0x66, 0xc9, 0x39, 0x52, 0x99, 0x49, 0x07, 0xd6, 0x9d, - 0xb7, 0x40, 0x34, 0x5f, 0xe7, 0x3a, 0xfa, 0x95, 0xeb, 0xa1, - 0x03, 0xb7, 0x52, 0x71, 0x93, 0x30, 0x0b, 0x51, 0x58, 0x82, - 0x07, 0x2f, 0x44, 0xa9, 0x4f, 0x9b, 0x1b, 0xf3, 0xd6, 0x21, - 0x3d, 0x68, 0xef, 0x3f, 0xaf, 0xc2, 0x6f, 0xa0, 0xd5, 0x2b, - 0xb8, 0x73, 0x84, 0x67, 0x36, 0x8b, 0xa4, 0x25, 0xe0, 0x86, - 0xd9, 0x14, 0x5c, 0x6c, 0xd8, 0x61, 0xe1, 0x0a, 0x6c, 0xaf, - 0xbb, 0x9c, 0xf6, 0x74, 0xca, 0x5a, 0x04, 0xac, 0x85, 0xc1, - 0x1b, 0x4d, 0xf2, 0x07, 0xb6, 0x1e, 0x97, 0x7b, 0x75, 0xdf, - 0x9b, 0x8a, 0x31, 0xc6, 0x90, 0xd5, 0x8d, 0x39, 0xc2, 0x54, - 0xf4, 0xe2, 0x83, 0x57, 0x12, 0x19, 0xf5, 0xb2, 0xd2, 0x53, - 0x81, 0x6d, 0xf0, 0x09, 0xc9, 0x80, 0x8b, 0x07, 0x7c, 0x59, - 0xcd, 0x78, 0x00, 0xd6, 0x44, 0x7f, 0xe4, 0xdb, 0x77, 0x02, - 0x00, 0x25, 0x79, 0x91, 0xc9, 0xde, 0xd0, 0xed, 0x3f, 0xfc, - 0x37, 0x36, 0xea, 0xf0, 0x56, 0x50, 0xe7, 0x38, 0xca, 0xe1, - 0x67, 0x12, 0x96, 0x55, 0x3e, 0xff, 0x97, 0xe5, 0xa7, 0x03, - 0x5b, 0x72, 0x80, 0xd6, 0xa5, 0x23, 0x39, 0x78, 0x07, 0xc8, - 0x83, 0x19, 0x74, 0xfb, 0x79, 0xc2, 0x9e, 0xbd, 0xf9, 0xaf, - 0x09, 0x0f, 0xbd, 0x3d, 0x34, 0xe8, 0x44, 0x89, 0xb1, 0xf1, - 0x2b, 0xa5, 0xff, 0x22, 0xc9, 0x47, 0xe2, 0x31, 0xb5, 0x6b, - 0x8a, 0x65, 0x5f, 0x81, 0x5f, 0x89, 0xb0, 0x03, 0x5d, 0x53, - 0x0e, 0xdd, 0xfb, 0xe5, 0x70, 0xaa, 0xd2, 0x37, 0x4d, 0xa1, - 0x7c, 0xf2, 0xe4, 0x7f, 0xf1, 0x4a, 0xaf, 0x12, 0xd1, 0x83, - 0xdc, 0xb2, 0x9e, 0xc1, 0x95, 0x3d, 0x04, 0x9f, 0xa3, 0xad, - 0xcc, 0x78, 0x14, 0x9a, 0xf9, 0x58, 0x39, 0x08, 0x15, 0xda, - 0x1b, 0x94, 0x50, 0x2d, 0x44, 0xc0, 0x23, 0x1c, 0x36, 0x5f, - 0x16, 0x08, 0xa3, 0xdf, 0x9e, 0x4f, 0xbb, 0x07, 0xcd, 0xe3, - 0x8c, 0xbf, 0xf1, 0xc3, 0x3e, 0x98, 0xf8, 0x49, 0x79, 0x58, - 0xc9, 0x0f, 0x47, 0xc0, 0xab, 0x2f, 0x21, 0x63, 0xf6, 0xe6, - 0xfe, 0x8a, 0xea, 0xbc, 0x32, 0x63, 0xca, 0x75, 0xf8, 0xa4, - 0x1b, 0x6c, 0xfe, 0x9a, 0x6e, 0x68, 0x1f, 0x48, 0x59, 0xfb, - 0x34, 0x43, 0x10, 0xd5, 0x0d, 0x80, 0x54, 0xcb, 0x67, 0x21, - 0xc7, 0x13, 0x85, 0x38, 0x0c, 0xf9, 0x40, 0x2e, 0x2e, 0x4a, - 0x05, 0x9e, 0x51, 0xae, 0xdd, 0xba, 0x23, 0x83, 0x66, 0x2a, - 0xbf, 0x7f, 0xca, 0x9c, 0x6c, 0x2d, 0x6b, 0x7d, 0x68, 0x52, - 0x81, 0x56, 0x2f, 0xea, 0xf9, 0xe7, 0xf1, 0x55, 0x16, 0xfc, - 0x29, 0xe2, 0xa5, 0x1e, 0x0a, 0x06, 0xe0, 0x85, 0x4e, 0xa6, - 0x5d, 0x20, 0x9d, 0x2b, 0xa2, 0xad, 0xaa, 0xd6, 0x9b, 0xd2, - 0x98, 0x29, 0x45, 0x5c, 0x55, 0xc0, 0x91, 0xa2, 0x65, 0xcd, - 0xac, 0xc6, 0x1a, 0x53, 0xa1, 0x46, 0x13, 0xf9, 0xfe, 0x1a, - 0xf6, 0xdf, 0xa5, 0x1a, 0x58, 0x7c, 0x81, 0x2e, 0x46, 0x46, - 0xf7, 0x2f, 0xd6, 0xaa, 0x21, 0xb0, 0x0e, 0x7e, 0xac, 0xb8, - 0xc6, 0x76, 0x62, 0x82, 0x3b, 0x0a, 0x36, 0xbe, 0x97, 0x16, - 0xd5, 0x79, 0x55, 0x15, 0x64, 0x2a, 0xbe, 0x19, 0x4e, 0x93, - 0x3b, 0x44, 0x7c, 0xe2, 0xfc, 0x18, 0x4e, 0x83, 0x37, 0xfb, - 0x26, 0x78, 0x6d, 0x24, 0x6b, 0x48, 0x21, 0x67, 0xde, 0xf5, - 0x00, 0x22, 0x9a, 0xec, 0x40, 0x16, 0x96, 0x8a, 0x3f, 0xd5, - 0xa6, 0x5e, 0x03, 0x84, 0xbb, 0x15, 0x4d, 0x55, 0x71, 0x00, - 0x90, 0xc2, 0x96, 0x25, 0x01, 0xab, 0xe6, 0x47, 0x44, 0x6f, - 0xf9, 0x53, 0x80, 0x2b, 0xa8, 0x83, 0xc8, 0x14, 0x77, 0x13, - 0x00, 0x66, 0xee, 0x7e, 0x7a, 0xa0, 0x28, 0x65, 0xf3, 0x31, - 0xb6, 0xac, 0xd7, 0x87, 0x84, 0x29, 0xed, 0x5b, 0xcd, 0x74, - 0xc0, 0x89, 0x51, 0x11, 0x9a, 0xd5, 0x7b, 0xe0, 0x9c, 0xd0, - 0x8d, 0x72, 0xe3, 0x77, 0xda, 0x0a, 0xc2, 0xdc, 0x6f, 0xad, - 0x49, 0x03, 0xfa, 0xe6, 0x7e, 0xa6, 0x24, 0x32, 0xe6, 0x8f, - 0xd9, 0x70, 0xfa, 0x59, 0x70, 0xa9, 0xa3, 0x08, 0x7d, 0x89, - 0xc4, 0x96, 0x61, 0xc2, 0xf5, 0xe5, 0xb5, 0x3b, 0x0d, 0xec, - 0xb8, 0x9c, 0xee, 0x09, 0x77, 0x27, 0xbd, 0x35, 0x66, 0x90, - 0x9e, 0x46, 0xf7, 0xbd, 0xa6, 0xc5, 0x31, 0xd4, 0x6a, 0x52, - 0x17, 0x5d, 0x0a, 0x0e, 0x2c, 0x34, 0x7a, 0x6a, 0x21, 0xac, - 0x42, 0xf0, 0x31, 0xde, 0x48, 0xe0, 0x27, 0xd0, 0x79, 0xc9, - 0x06, 0x94, 0x7b, 0x51, 0x4b, 0x5b, 0x02, 0x6a, 0x19, 0xba, - 0x71, 0x45, 0x9c, 0xdf, 0xe6, 0x30, 0x9e, 0xaa, 0xad, 0xa1, - 0x87, 0xf6, 0x37, 0xde, 0xa2, 0x97, 0x68, 0x20, 0x2d, 0x5a, - 0xdc, 0xdd, 0x91, 0x63, 0x5f, 0x79, 0xda, 0x99, 0x20, 0x3a, - 0x4b, 0xe5, 0x43, 0x0e, 0x12, 0x70, 0x57, 0x91, 0xfa, 0xee, - 0xc4, 0xb6, 0xb6, 0xb1, 0xf1, 0x06, 0xbd, 0xcf, 0x8d, 0x2a, - 0x05, 0xc0, 0x07, 0x23, 0x84, 0x85, 0xef, 0x9c, 0xbb, 0x6f, - 0x5f, 0x4a, 0x9a, 0x27, 0x9f, 0x9f, 0x32, 0x97, 0xe8, 0x24, - 0xb9, 0x64, 0x2c, 0x39, 0xff, 0x2f, 0x4b, 0xc4, 0x7e, 0x65, - 0xfe, 0xbb, 0x5c, 0xa0, 0xb2, 0x6e, 0xc4, 0xb6, 0x93, 0x2b, - 0x51, 0x9e, 0x2e, 0x1f, 0xd8, 0xcf, 0x60, 0xe0, 0x75, 0x15, - 0xf9, 0xa0, 0x67, 0x99, 0x88, 0x2b, 0x76, 0xce, 0x41, 0x42, - 0x10, 0x29, 0x89, 0xbf, 0xca, 0xb7, 0x61, 0x08, 0x94, 0xee, - 0xa0, 0xb3, 0x3a, 0x09, 0xc5, 0x6f, 0x04, 0xf9, 0x1b, 0xb5, - 0x64, 0x99, 0x08, 0xe4, 0xcc, 0xce, 0xdf, 0x71, 0x65, 0x8a, - 0x6d, 0x62, 0xde, 0x76, 0x1d, 0x6d, 0x6b, 0x78, 0x22, 0x32, - 0x63, 0xdd, 0x53, 0x7d, 0xec, 0xed, 0x9d, 0x82, 0xa9, 0x2c, - 0x5c, 0x8a, 0x17, 0xdd, 0x85, 0xf9, 0xd2, 0xac, 0x6e, 0x98, - 0x60, 0x2e, 0x08, 0xd4, 0x06, 0x76, 0xf4, 0x97, 0xca, 0xb1, - 0x72, 0x50, 0x5b, 0x83, 0xea, 0xbb, 0x39, 0x0f, 0x18, 0xb3, - 0xb8, 0x03, 0xee, 0x7c, 0x84, 0xa9, 0x69, 0xcd, 0x1d, 0xbd, - 0xe2, 0xb7, 0xce, 0xe2, 0x6f, 0x03, 0x49, 0x52, 0x67, 0xa0, - 0x1b, 0x23, 0x43, 0x92, 0x2c, 0x7c, 0x3b, 0x65, 0xe8, 0x61, - 0x99, 0xde, 0xb5, 0xf1, 0x63, 0x73, 0x92, 0x6c, 0x70, 0x8b, - 0x83, 0x10, 0xb4, 0x06, 0x2c, 0x99, 0x12, 0x73, 0xec, 0x87, - 0x92, 0x09, 0x67, 0x96, 0xd6, 0x9c, 0x9f, 0x35, 0x48, 0x48, - 0x3b, 0x44, 0x00, 0x73, 0x1c, 0x59, 0xeb, 0x81, 0x7b, 0xd1, - 0xda, 0x76, 0xcf, 0xc2, 0x4d, 0xf1, 0xa2, 0x5b, 0x2f, 0x5f, - 0x91, 0x29, 0x6e, 0x08, 0x37, 0xd6, 0xaa, 0xd2, 0xf8, 0x4f, - 0x5e, 0x00, 0x16, 0x52 -}; diff --git a/contrib/libs/openssl/apps/timeouts.h b/contrib/libs/openssl/apps/timeouts.h deleted file mode 100644 index 7e606cba0b..0000000000 --- a/contrib/libs/openssl/apps/timeouts.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#ifndef OSSL_APPS_TIMEOUTS_H -# define OSSL_APPS_TIMEOUTS_H - -/* numbers in us */ -# define DGRAM_RCV_TIMEOUT 250000 -# define DGRAM_SND_TIMEOUT 250000 - -#endif /* ! OSSL_APPS_TIMEOUTS_H */ diff --git a/contrib/libs/openssl/apps/ts.c b/contrib/libs/openssl/apps/ts.c deleted file mode 100644 index 66a0c810e0..0000000000 --- a/contrib/libs/openssl/apps/ts.c +++ /dev/null @@ -1,983 +0,0 @@ -/* - * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <openssl/opensslconf.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/pem.h> -#include <openssl/rand.h> -#include <openssl/ts.h> -#include <openssl/bn.h> - -/* Request nonce length, in bits (must be a multiple of 8). */ -#define NONCE_LENGTH 64 - -/* Name of config entry that defines the OID file. */ -#define ENV_OID_FILE "oid_file" - -/* Is |EXACTLY_ONE| of three pointers set? */ -#define EXACTLY_ONE(a, b, c) \ - (( a && !b && !c) || \ - ( b && !a && !c) || \ - ( c && !a && !b)) - -static ASN1_OBJECT *txt2obj(const char *oid); -static CONF *load_config_file(const char *configfile); - -/* Query related functions. */ -static int query_command(const char *data, const char *digest, - const EVP_MD *md, const char *policy, int no_nonce, - int cert, const char *in, const char *out, int text); -static TS_REQ *create_query(BIO *data_bio, const char *digest, const EVP_MD *md, - const char *policy, int no_nonce, int cert); -static int create_digest(BIO *input, const char *digest, - const EVP_MD *md, unsigned char **md_value); -static ASN1_INTEGER *create_nonce(int bits); - -/* Reply related functions. */ -static int reply_command(CONF *conf, const char *section, const char *engine, - const char *queryfile, const char *passin, const char *inkey, - const EVP_MD *md, const char *signer, const char *chain, - const char *policy, const char *in, int token_in, - const char *out, int token_out, int text); -static TS_RESP *read_PKCS7(BIO *in_bio); -static TS_RESP *create_response(CONF *conf, const char *section, const char *engine, - const char *queryfile, const char *passin, - const char *inkey, const EVP_MD *md, const char *signer, - const char *chain, const char *policy); -static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data); -static ASN1_INTEGER *next_serial(const char *serialfile); -static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial); - -/* Verify related functions. */ -static int verify_command(const char *data, const char *digest, const char *queryfile, - const char *in, int token_in, - const char *CApath, const char *CAfile, const char *untrusted, - X509_VERIFY_PARAM *vpm); -static TS_VERIFY_CTX *create_verify_ctx(const char *data, const char *digest, - const char *queryfile, - const char *CApath, const char *CAfile, - const char *untrusted, - X509_VERIFY_PARAM *vpm); -static X509_STORE *create_cert_store(const char *CApath, const char *CAfile, - X509_VERIFY_PARAM *vpm); -static int verify_cb(int ok, X509_STORE_CTX *ctx); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENGINE, OPT_CONFIG, OPT_SECTION, OPT_QUERY, OPT_DATA, - OPT_DIGEST, OPT_TSPOLICY, OPT_NO_NONCE, OPT_CERT, - OPT_IN, OPT_TOKEN_IN, OPT_OUT, OPT_TOKEN_OUT, OPT_TEXT, - OPT_REPLY, OPT_QUERYFILE, OPT_PASSIN, OPT_INKEY, OPT_SIGNER, - OPT_CHAIN, OPT_VERIFY, OPT_CAPATH, OPT_CAFILE, OPT_UNTRUSTED, - OPT_MD, OPT_V_ENUM, OPT_R_ENUM -} OPTION_CHOICE; - -const OPTIONS ts_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"config", OPT_CONFIG, '<', "Configuration file"}, - {"section", OPT_SECTION, 's', "Section to use within config file"}, - {"query", OPT_QUERY, '-', "Generate a TS query"}, - {"data", OPT_DATA, '<', "File to hash"}, - {"digest", OPT_DIGEST, 's', "Digest (as a hex string)"}, - OPT_R_OPTIONS, - {"tspolicy", OPT_TSPOLICY, 's', "Policy OID to use"}, - {"no_nonce", OPT_NO_NONCE, '-', "Do not include a nonce"}, - {"cert", OPT_CERT, '-', "Put cert request into query"}, - {"in", OPT_IN, '<', "Input file"}, - {"token_in", OPT_TOKEN_IN, '-', "Input is a PKCS#7 file"}, - {"out", OPT_OUT, '>', "Output file"}, - {"token_out", OPT_TOKEN_OUT, '-', "Output is a PKCS#7 file"}, - {"text", OPT_TEXT, '-', "Output text (not DER)"}, - {"reply", OPT_REPLY, '-', "Generate a TS reply"}, - {"queryfile", OPT_QUERYFILE, '<', "File containing a TS query"}, - {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, - {"inkey", OPT_INKEY, 's', "File with private key for reply"}, - {"signer", OPT_SIGNER, 's', "Signer certificate file"}, - {"chain", OPT_CHAIN, '<', "File with signer CA chain"}, - {"verify", OPT_VERIFY, '-', "Verify a TS response"}, - {"CApath", OPT_CAPATH, '/', "Path to trusted CA files"}, - {"CAfile", OPT_CAFILE, '<', "File with trusted CA certs"}, - {"untrusted", OPT_UNTRUSTED, '<', "File with untrusted certs"}, - {"", OPT_MD, '-', "Any supported digest"}, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {OPT_HELP_STR, 1, '-', "\nOptions specific to 'ts -verify': \n"}, - OPT_V_OPTIONS, - {OPT_HELP_STR, 1, '-', "\n"}, - {NULL} -}; - -/* - * This command is so complex, special help is needed. - */ -static char* opt_helplist[] = { - "Typical uses:", - "ts -query [-rand file...] [-config file] [-data file]", - " [-digest hexstring] [-tspolicy oid] [-no_nonce] [-cert]", - " [-in file] [-out file] [-text]", - " or", - "ts -reply [-config file] [-section tsa_section]", - " [-queryfile file] [-passin password]", - " [-signer tsa_cert.pem] [-inkey private_key.pem]", - " [-chain certs_file.pem] [-tspolicy oid]", - " [-in file] [-token_in] [-out file] [-token_out]", -#ifndef OPENSSL_NO_ENGINE - " [-text] [-engine id]", -#else - " [-text]", -#endif - " or", - "ts -verify -CApath dir -CAfile file.pem -untrusted file.pem", - " [-data file] [-digest hexstring]", - " [-queryfile file] -in file [-token_in]", - " [[options specific to 'ts -verify']]", - NULL, -}; - -int ts_main(int argc, char **argv) -{ - CONF *conf = NULL; - const char *CAfile = NULL, *untrusted = NULL, *prog; - const char *configfile = default_config_file, *engine = NULL; - const char *section = NULL; - char **helpp; - char *password = NULL; - char *data = NULL, *digest = NULL, *policy = NULL; - char *in = NULL, *out = NULL, *queryfile = NULL, *passin = NULL; - char *inkey = NULL, *signer = NULL, *chain = NULL, *CApath = NULL; - const EVP_MD *md = NULL; - OPTION_CHOICE o, mode = OPT_ERR; - int ret = 1, no_nonce = 0, cert = 0, text = 0; - int vpmtouched = 0; - X509_VERIFY_PARAM *vpm = NULL; - /* Input is ContentInfo instead of TimeStampResp. */ - int token_in = 0; - /* Output is ContentInfo instead of TimeStampResp. */ - int token_out = 0; - - if ((vpm = X509_VERIFY_PARAM_new()) == NULL) - goto end; - - prog = opt_init(argc, argv, ts_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(ts_options); - for (helpp = opt_helplist; *helpp; ++helpp) - BIO_printf(bio_err, "%s\n", *helpp); - ret = 0; - goto end; - case OPT_CONFIG: - configfile = opt_arg(); - break; - case OPT_SECTION: - section = opt_arg(); - break; - case OPT_QUERY: - case OPT_REPLY: - case OPT_VERIFY: - if (mode != OPT_ERR) - goto opthelp; - mode = o; - break; - case OPT_DATA: - data = opt_arg(); - break; - case OPT_DIGEST: - digest = opt_arg(); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_TSPOLICY: - policy = opt_arg(); - break; - case OPT_NO_NONCE: - no_nonce = 1; - break; - case OPT_CERT: - cert = 1; - break; - case OPT_IN: - in = opt_arg(); - break; - case OPT_TOKEN_IN: - token_in = 1; - break; - case OPT_OUT: - out = opt_arg(); - break; - case OPT_TOKEN_OUT: - token_out = 1; - break; - case OPT_TEXT: - text = 1; - break; - case OPT_QUERYFILE: - queryfile = opt_arg(); - break; - case OPT_PASSIN: - passin = opt_arg(); - break; - case OPT_INKEY: - inkey = opt_arg(); - break; - case OPT_SIGNER: - signer = opt_arg(); - break; - case OPT_CHAIN: - chain = opt_arg(); - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_UNTRUSTED: - untrusted = opt_arg(); - break; - case OPT_ENGINE: - engine = opt_arg(); - break; - case OPT_MD: - if (!opt_md(opt_unknown(), &md)) - goto opthelp; - break; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto end; - vpmtouched++; - break; - } - } - if (mode == OPT_ERR || opt_num_rest() != 0) - goto opthelp; - - if (mode == OPT_REPLY && passin && - !app_passwd(passin, NULL, &password, NULL)) { - BIO_printf(bio_err, "Error getting password.\n"); - goto end; - } - - if ((conf = load_config_file(configfile)) == NULL) - goto end; - if (configfile != default_config_file && !app_load_modules(conf)) - goto end; - - /* Check parameter consistency and execute the appropriate function. */ - if (mode == OPT_QUERY) { - if (vpmtouched) - goto opthelp; - if ((data != NULL) && (digest != NULL)) - goto opthelp; - ret = !query_command(data, digest, md, policy, no_nonce, cert, - in, out, text); - } else if (mode == OPT_REPLY) { - if (vpmtouched) - goto opthelp; - if ((in != NULL) && (queryfile != NULL)) - goto opthelp; - if (in == NULL) { - if ((conf == NULL) || (token_in != 0)) - goto opthelp; - } - ret = !reply_command(conf, section, engine, queryfile, - password, inkey, md, signer, chain, policy, - in, token_in, out, token_out, text); - - } else if (mode == OPT_VERIFY) { - if ((in == NULL) || !EXACTLY_ONE(queryfile, data, digest)) - goto opthelp; - ret = !verify_command(data, digest, queryfile, in, token_in, - CApath, CAfile, untrusted, - vpmtouched ? vpm : NULL); - } else { - goto opthelp; - } - - end: - X509_VERIFY_PARAM_free(vpm); - NCONF_free(conf); - OPENSSL_free(password); - return ret; -} - -/* - * Configuration file-related function definitions. - */ - -static ASN1_OBJECT *txt2obj(const char *oid) -{ - ASN1_OBJECT *oid_obj = NULL; - - if ((oid_obj = OBJ_txt2obj(oid, 0)) == NULL) - BIO_printf(bio_err, "cannot convert %s to OID\n", oid); - - return oid_obj; -} - -static CONF *load_config_file(const char *configfile) -{ - CONF *conf = app_load_config(configfile); - - if (conf != NULL) { - const char *p; - - BIO_printf(bio_err, "Using configuration from %s\n", configfile); - p = NCONF_get_string(conf, NULL, ENV_OID_FILE); - if (p != NULL) { - BIO *oid_bio = BIO_new_file(p, "r"); - if (!oid_bio) - ERR_print_errors(bio_err); - else { - OBJ_create_objects(oid_bio); - BIO_free_all(oid_bio); - } - } else - ERR_clear_error(); - if (!add_oid_section(conf)) - ERR_print_errors(bio_err); - } - return conf; -} - -/* - * Query-related method definitions. - */ -static int query_command(const char *data, const char *digest, const EVP_MD *md, - const char *policy, int no_nonce, - int cert, const char *in, const char *out, int text) -{ - int ret = 0; - TS_REQ *query = NULL; - BIO *in_bio = NULL; - BIO *data_bio = NULL; - BIO *out_bio = NULL; - - /* Build query object. */ - if (in != NULL) { - if ((in_bio = bio_open_default(in, 'r', FORMAT_ASN1)) == NULL) - goto end; - query = d2i_TS_REQ_bio(in_bio, NULL); - } else { - if (digest == NULL - && (data_bio = bio_open_default(data, 'r', FORMAT_ASN1)) == NULL) - goto end; - query = create_query(data_bio, digest, md, policy, no_nonce, cert); - } - if (query == NULL) - goto end; - - if (text) { - if ((out_bio = bio_open_default(out, 'w', FORMAT_TEXT)) == NULL) - goto end; - if (!TS_REQ_print_bio(out_bio, query)) - goto end; - } else { - if ((out_bio = bio_open_default(out, 'w', FORMAT_ASN1)) == NULL) - goto end; - if (!i2d_TS_REQ_bio(out_bio, query)) - goto end; - } - - ret = 1; - - end: - ERR_print_errors(bio_err); - BIO_free_all(in_bio); - BIO_free_all(data_bio); - BIO_free_all(out_bio); - TS_REQ_free(query); - return ret; -} - -static TS_REQ *create_query(BIO *data_bio, const char *digest, const EVP_MD *md, - const char *policy, int no_nonce, int cert) -{ - int ret = 0; - TS_REQ *ts_req = NULL; - int len; - TS_MSG_IMPRINT *msg_imprint = NULL; - X509_ALGOR *algo = NULL; - unsigned char *data = NULL; - ASN1_OBJECT *policy_obj = NULL; - ASN1_INTEGER *nonce_asn1 = NULL; - - if (md == NULL && (md = EVP_get_digestbyname("sha1")) == NULL) - goto err; - if ((ts_req = TS_REQ_new()) == NULL) - goto err; - if (!TS_REQ_set_version(ts_req, 1)) - goto err; - if ((msg_imprint = TS_MSG_IMPRINT_new()) == NULL) - goto err; - if ((algo = X509_ALGOR_new()) == NULL) - goto err; - if ((algo->algorithm = OBJ_nid2obj(EVP_MD_type(md))) == NULL) - goto err; - if ((algo->parameter = ASN1_TYPE_new()) == NULL) - goto err; - algo->parameter->type = V_ASN1_NULL; - if (!TS_MSG_IMPRINT_set_algo(msg_imprint, algo)) - goto err; - if ((len = create_digest(data_bio, digest, md, &data)) == 0) - goto err; - if (!TS_MSG_IMPRINT_set_msg(msg_imprint, data, len)) - goto err; - if (!TS_REQ_set_msg_imprint(ts_req, msg_imprint)) - goto err; - if (policy && (policy_obj = txt2obj(policy)) == NULL) - goto err; - if (policy_obj && !TS_REQ_set_policy_id(ts_req, policy_obj)) - goto err; - - /* Setting nonce if requested. */ - if (!no_nonce && (nonce_asn1 = create_nonce(NONCE_LENGTH)) == NULL) - goto err; - if (nonce_asn1 && !TS_REQ_set_nonce(ts_req, nonce_asn1)) - goto err; - if (!TS_REQ_set_cert_req(ts_req, cert)) - goto err; - - ret = 1; - err: - if (!ret) { - TS_REQ_free(ts_req); - ts_req = NULL; - BIO_printf(bio_err, "could not create query\n"); - ERR_print_errors(bio_err); - } - TS_MSG_IMPRINT_free(msg_imprint); - X509_ALGOR_free(algo); - OPENSSL_free(data); - ASN1_OBJECT_free(policy_obj); - ASN1_INTEGER_free(nonce_asn1); - return ts_req; -} - -static int create_digest(BIO *input, const char *digest, const EVP_MD *md, - unsigned char **md_value) -{ - int md_value_len; - int rv = 0; - EVP_MD_CTX *md_ctx = NULL; - - md_value_len = EVP_MD_size(md); - if (md_value_len < 0) - return 0; - - if (input != NULL) { - unsigned char buffer[4096]; - int length; - - md_ctx = EVP_MD_CTX_new(); - if (md_ctx == NULL) - return 0; - *md_value = app_malloc(md_value_len, "digest buffer"); - if (!EVP_DigestInit(md_ctx, md)) - goto err; - while ((length = BIO_read(input, buffer, sizeof(buffer))) > 0) { - if (!EVP_DigestUpdate(md_ctx, buffer, length)) - goto err; - } - if (!EVP_DigestFinal(md_ctx, *md_value, NULL)) - goto err; - md_value_len = EVP_MD_size(md); - } else { - long digest_len; - *md_value = OPENSSL_hexstr2buf(digest, &digest_len); - if (!*md_value || md_value_len != digest_len) { - OPENSSL_free(*md_value); - *md_value = NULL; - BIO_printf(bio_err, "bad digest, %d bytes " - "must be specified\n", md_value_len); - return 0; - } - } - rv = md_value_len; - err: - EVP_MD_CTX_free(md_ctx); - return rv; -} - -static ASN1_INTEGER *create_nonce(int bits) -{ - unsigned char buf[20]; - ASN1_INTEGER *nonce = NULL; - int len = (bits - 1) / 8 + 1; - int i; - - if (len > (int)sizeof(buf)) - goto err; - if (RAND_bytes(buf, len) <= 0) - goto err; - - /* Find the first non-zero byte and creating ASN1_INTEGER object. */ - for (i = 0; i < len && !buf[i]; ++i) - continue; - if ((nonce = ASN1_INTEGER_new()) == NULL) - goto err; - OPENSSL_free(nonce->data); - nonce->length = len - i; - nonce->data = app_malloc(nonce->length + 1, "nonce buffer"); - memcpy(nonce->data, buf + i, nonce->length); - return nonce; - - err: - BIO_printf(bio_err, "could not create nonce\n"); - ASN1_INTEGER_free(nonce); - return NULL; -} - -/* - * Reply-related method definitions. - */ - -static int reply_command(CONF *conf, const char *section, const char *engine, - const char *queryfile, const char *passin, const char *inkey, - const EVP_MD *md, const char *signer, const char *chain, - const char *policy, const char *in, int token_in, - const char *out, int token_out, int text) -{ - int ret = 0; - TS_RESP *response = NULL; - BIO *in_bio = NULL; - BIO *query_bio = NULL; - BIO *inkey_bio = NULL; - BIO *signer_bio = NULL; - BIO *out_bio = NULL; - - if (in != NULL) { - if ((in_bio = BIO_new_file(in, "rb")) == NULL) - goto end; - if (token_in) { - response = read_PKCS7(in_bio); - } else { - response = d2i_TS_RESP_bio(in_bio, NULL); - } - } else { - response = create_response(conf, section, engine, queryfile, - passin, inkey, md, signer, chain, policy); - if (response != NULL) - BIO_printf(bio_err, "Response has been generated.\n"); - else - BIO_printf(bio_err, "Response is not generated.\n"); - } - if (response == NULL) - goto end; - - /* Write response. */ - if (text) { - if ((out_bio = bio_open_default(out, 'w', FORMAT_TEXT)) == NULL) - goto end; - if (token_out) { - TS_TST_INFO *tst_info = TS_RESP_get_tst_info(response); - if (!TS_TST_INFO_print_bio(out_bio, tst_info)) - goto end; - } else { - if (!TS_RESP_print_bio(out_bio, response)) - goto end; - } - } else { - if ((out_bio = bio_open_default(out, 'w', FORMAT_ASN1)) == NULL) - goto end; - if (token_out) { - PKCS7 *token = TS_RESP_get_token(response); - if (!i2d_PKCS7_bio(out_bio, token)) - goto end; - } else { - if (!i2d_TS_RESP_bio(out_bio, response)) - goto end; - } - } - - ret = 1; - - end: - ERR_print_errors(bio_err); - BIO_free_all(in_bio); - BIO_free_all(query_bio); - BIO_free_all(inkey_bio); - BIO_free_all(signer_bio); - BIO_free_all(out_bio); - TS_RESP_free(response); - return ret; -} - -/* Reads a PKCS7 token and adds default 'granted' status info to it. */ -static TS_RESP *read_PKCS7(BIO *in_bio) -{ - int ret = 0; - PKCS7 *token = NULL; - TS_TST_INFO *tst_info = NULL; - TS_RESP *resp = NULL; - TS_STATUS_INFO *si = NULL; - - if ((token = d2i_PKCS7_bio(in_bio, NULL)) == NULL) - goto end; - if ((tst_info = PKCS7_to_TS_TST_INFO(token)) == NULL) - goto end; - if ((resp = TS_RESP_new()) == NULL) - goto end; - if ((si = TS_STATUS_INFO_new()) == NULL) - goto end; - if (!TS_STATUS_INFO_set_status(si, TS_STATUS_GRANTED)) - goto end; - if (!TS_RESP_set_status_info(resp, si)) - goto end; - TS_RESP_set_tst_info(resp, token, tst_info); - token = NULL; /* Ownership is lost. */ - tst_info = NULL; /* Ownership is lost. */ - ret = 1; - - end: - PKCS7_free(token); - TS_TST_INFO_free(tst_info); - if (!ret) { - TS_RESP_free(resp); - resp = NULL; - } - TS_STATUS_INFO_free(si); - return resp; -} - -static TS_RESP *create_response(CONF *conf, const char *section, const char *engine, - const char *queryfile, const char *passin, - const char *inkey, const EVP_MD *md, const char *signer, - const char *chain, const char *policy) -{ - int ret = 0; - TS_RESP *response = NULL; - BIO *query_bio = NULL; - TS_RESP_CTX *resp_ctx = NULL; - - if ((query_bio = BIO_new_file(queryfile, "rb")) == NULL) - goto end; - if ((section = TS_CONF_get_tsa_section(conf, section)) == NULL) - goto end; - if ((resp_ctx = TS_RESP_CTX_new()) == NULL) - goto end; - if (!TS_CONF_set_serial(conf, section, serial_cb, resp_ctx)) - goto end; -#ifndef OPENSSL_NO_ENGINE - if (!TS_CONF_set_crypto_device(conf, section, engine)) - goto end; -#endif - if (!TS_CONF_set_signer_cert(conf, section, signer, resp_ctx)) - goto end; - if (!TS_CONF_set_certs(conf, section, chain, resp_ctx)) - goto end; - if (!TS_CONF_set_signer_key(conf, section, inkey, passin, resp_ctx)) - goto end; - - if (md) { - if (!TS_RESP_CTX_set_signer_digest(resp_ctx, md)) - goto end; - } else if (!TS_CONF_set_signer_digest(conf, section, NULL, resp_ctx)) { - goto end; - } - - if (!TS_CONF_set_ess_cert_id_digest(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_def_policy(conf, section, policy, resp_ctx)) - goto end; - if (!TS_CONF_set_policies(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_digests(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_accuracy(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_clock_precision_digits(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_ordering(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_tsa_name(conf, section, resp_ctx)) - goto end; - if (!TS_CONF_set_ess_cert_id_chain(conf, section, resp_ctx)) - goto end; - if ((response = TS_RESP_create_response(resp_ctx, query_bio)) == NULL) - goto end; - ret = 1; - - end: - if (!ret) { - TS_RESP_free(response); - response = NULL; - } - TS_RESP_CTX_free(resp_ctx); - BIO_free_all(query_bio); - return response; -} - -static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data) -{ - const char *serial_file = (const char *)data; - ASN1_INTEGER *serial = next_serial(serial_file); - - if (serial == NULL) { - TS_RESP_CTX_set_status_info(ctx, TS_STATUS_REJECTION, - "Error during serial number " - "generation."); - TS_RESP_CTX_add_failure_info(ctx, TS_INFO_ADD_INFO_NOT_AVAILABLE); - } else { - save_ts_serial(serial_file, serial); - } - - return serial; -} - -static ASN1_INTEGER *next_serial(const char *serialfile) -{ - int ret = 0; - BIO *in = NULL; - ASN1_INTEGER *serial = NULL; - BIGNUM *bn = NULL; - - if ((serial = ASN1_INTEGER_new()) == NULL) - goto err; - - if ((in = BIO_new_file(serialfile, "r")) == NULL) { - ERR_clear_error(); - BIO_printf(bio_err, "Warning: could not open file %s for " - "reading, using serial number: 1\n", serialfile); - if (!ASN1_INTEGER_set(serial, 1)) - goto err; - } else { - char buf[1024]; - if (!a2i_ASN1_INTEGER(in, serial, buf, sizeof(buf))) { - BIO_printf(bio_err, "unable to load number from %s\n", - serialfile); - goto err; - } - if ((bn = ASN1_INTEGER_to_BN(serial, NULL)) == NULL) - goto err; - ASN1_INTEGER_free(serial); - serial = NULL; - if (!BN_add_word(bn, 1)) - goto err; - if ((serial = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) - goto err; - } - ret = 1; - - err: - if (!ret) { - ASN1_INTEGER_free(serial); - serial = NULL; - } - BIO_free_all(in); - BN_free(bn); - return serial; -} - -static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial) -{ - int ret = 0; - BIO *out = NULL; - - if ((out = BIO_new_file(serialfile, "w")) == NULL) - goto err; - if (i2a_ASN1_INTEGER(out, serial) <= 0) - goto err; - if (BIO_puts(out, "\n") <= 0) - goto err; - ret = 1; - err: - if (!ret) - BIO_printf(bio_err, "could not save serial number to %s\n", - serialfile); - BIO_free_all(out); - return ret; -} - - -/* - * Verify-related method definitions. - */ - -static int verify_command(const char *data, const char *digest, const char *queryfile, - const char *in, int token_in, - const char *CApath, const char *CAfile, const char *untrusted, - X509_VERIFY_PARAM *vpm) -{ - BIO *in_bio = NULL; - PKCS7 *token = NULL; - TS_RESP *response = NULL; - TS_VERIFY_CTX *verify_ctx = NULL; - int ret = 0; - - if ((in_bio = BIO_new_file(in, "rb")) == NULL) - goto end; - if (token_in) { - if ((token = d2i_PKCS7_bio(in_bio, NULL)) == NULL) - goto end; - } else { - if ((response = d2i_TS_RESP_bio(in_bio, NULL)) == NULL) - goto end; - } - - if ((verify_ctx = create_verify_ctx(data, digest, queryfile, - CApath, CAfile, untrusted, - vpm)) == NULL) - goto end; - - ret = token_in - ? TS_RESP_verify_token(verify_ctx, token) - : TS_RESP_verify_response(verify_ctx, response); - - end: - printf("Verification: "); - if (ret) - printf("OK\n"); - else { - printf("FAILED\n"); - ERR_print_errors(bio_err); - } - - BIO_free_all(in_bio); - PKCS7_free(token); - TS_RESP_free(response); - TS_VERIFY_CTX_free(verify_ctx); - return ret; -} - -static TS_VERIFY_CTX *create_verify_ctx(const char *data, const char *digest, - const char *queryfile, - const char *CApath, const char *CAfile, - const char *untrusted, - X509_VERIFY_PARAM *vpm) -{ - TS_VERIFY_CTX *ctx = NULL; - BIO *input = NULL; - TS_REQ *request = NULL; - int ret = 0; - int f = 0; - - if (data != NULL || digest != NULL) { - if ((ctx = TS_VERIFY_CTX_new()) == NULL) - goto err; - f = TS_VFY_VERSION | TS_VFY_SIGNER; - if (data != NULL) { - BIO *out = NULL; - - f |= TS_VFY_DATA; - if ((out = BIO_new_file(data, "rb")) == NULL) - goto err; - if (TS_VERIFY_CTX_set_data(ctx, out) == NULL) { - BIO_free_all(out); - goto err; - } - } else if (digest != NULL) { - long imprint_len; - unsigned char *hexstr = OPENSSL_hexstr2buf(digest, &imprint_len); - f |= TS_VFY_IMPRINT; - if (TS_VERIFY_CTX_set_imprint(ctx, hexstr, imprint_len) == NULL) { - BIO_printf(bio_err, "invalid digest string\n"); - goto err; - } - } - - } else if (queryfile != NULL) { - if ((input = BIO_new_file(queryfile, "rb")) == NULL) - goto err; - if ((request = d2i_TS_REQ_bio(input, NULL)) == NULL) - goto err; - if ((ctx = TS_REQ_to_TS_VERIFY_CTX(request, NULL)) == NULL) - goto err; - } else { - return NULL; - } - - /* Add the signature verification flag and arguments. */ - TS_VERIFY_CTX_add_flags(ctx, f | TS_VFY_SIGNATURE); - - /* Initialising the X509_STORE object. */ - if (TS_VERIFY_CTX_set_store(ctx, create_cert_store(CApath, CAfile, vpm)) - == NULL) - goto err; - - /* Loading untrusted certificates. */ - if (untrusted - && TS_VERIFY_CTS_set_certs(ctx, TS_CONF_load_certs(untrusted)) == NULL) - goto err; - ret = 1; - - err: - if (!ret) { - TS_VERIFY_CTX_free(ctx); - ctx = NULL; - } - BIO_free_all(input); - TS_REQ_free(request); - return ctx; -} - -static X509_STORE *create_cert_store(const char *CApath, const char *CAfile, - X509_VERIFY_PARAM *vpm) -{ - X509_STORE *cert_ctx = NULL; - X509_LOOKUP *lookup = NULL; - int i; - - cert_ctx = X509_STORE_new(); - X509_STORE_set_verify_cb(cert_ctx, verify_cb); - if (CApath != NULL) { - lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_hash_dir()); - if (lookup == NULL) { - BIO_printf(bio_err, "memory allocation failure\n"); - goto err; - } - i = X509_LOOKUP_add_dir(lookup, CApath, X509_FILETYPE_PEM); - if (!i) { - BIO_printf(bio_err, "Error loading directory %s\n", CApath); - goto err; - } - } - - if (CAfile != NULL) { - lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_file()); - if (lookup == NULL) { - BIO_printf(bio_err, "memory allocation failure\n"); - goto err; - } - i = X509_LOOKUP_load_file(lookup, CAfile, X509_FILETYPE_PEM); - if (!i) { - BIO_printf(bio_err, "Error loading file %s\n", CAfile); - goto err; - } - } - - if (vpm != NULL) - X509_STORE_set1_param(cert_ctx, vpm); - - return cert_ctx; - - err: - X509_STORE_free(cert_ctx); - return NULL; -} - -static int verify_cb(int ok, X509_STORE_CTX *ctx) -{ - return ok; -} diff --git a/contrib/libs/openssl/apps/verify.c b/contrib/libs/openssl/apps/verify.c deleted file mode 100644 index 1f93856060..0000000000 --- a/contrib/libs/openssl/apps/verify.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/err.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/pem.h> - -static int cb(int ok, X509_STORE_CTX *ctx); -static int check(X509_STORE *ctx, const char *file, - STACK_OF(X509) *uchain, STACK_OF(X509) *tchain, - STACK_OF(X509_CRL) *crls, int show_chain); -static int v_verbose = 0, vflags = 0; - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_ENGINE, OPT_CAPATH, OPT_CAFILE, OPT_NOCAPATH, OPT_NOCAFILE, - OPT_UNTRUSTED, OPT_TRUSTED, OPT_CRLFILE, OPT_CRL_DOWNLOAD, OPT_SHOW_CHAIN, - OPT_V_ENUM, OPT_NAMEOPT, - OPT_VERBOSE -} OPTION_CHOICE; - -const OPTIONS verify_options[] = { - {OPT_HELP_STR, 1, '-', "Usage: %s [options] cert.pem...\n"}, - {OPT_HELP_STR, 1, '-', "Valid options are:\n"}, - {"help", OPT_HELP, '-', "Display this summary"}, - {"verbose", OPT_VERBOSE, '-', - "Print extra information about the operations being performed."}, - {"CApath", OPT_CAPATH, '/', "A directory of trusted certificates"}, - {"CAfile", OPT_CAFILE, '<', "A file of trusted certificates"}, - {"no-CAfile", OPT_NOCAFILE, '-', - "Do not load the default certificates file"}, - {"no-CApath", OPT_NOCAPATH, '-', - "Do not load certificates from the default certificates directory"}, - {"untrusted", OPT_UNTRUSTED, '<', "A file of untrusted certificates"}, - {"trusted", OPT_TRUSTED, '<', "A file of trusted certificates"}, - {"CRLfile", OPT_CRLFILE, '<', - "File containing one or more CRL's (in PEM format) to load"}, - {"crl_download", OPT_CRL_DOWNLOAD, '-', - "Attempt to download CRL information for this certificate"}, - {"show_chain", OPT_SHOW_CHAIN, '-', - "Display information about the certificate chain"}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - OPT_V_OPTIONS, -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {NULL} -}; - -int verify_main(int argc, char **argv) -{ - ENGINE *e = NULL; - STACK_OF(X509) *untrusted = NULL, *trusted = NULL; - STACK_OF(X509_CRL) *crls = NULL; - X509_STORE *store = NULL; - X509_VERIFY_PARAM *vpm = NULL; - const char *prog, *CApath = NULL, *CAfile = NULL; - int noCApath = 0, noCAfile = 0; - int vpmtouched = 0, crl_download = 0, show_chain = 0, i = 0, ret = 1; - OPTION_CHOICE o; - - if ((vpm = X509_VERIFY_PARAM_new()) == NULL) - goto end; - - prog = opt_init(argc, argv, verify_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(verify_options); - BIO_printf(bio_err, "Recognized usages:\n"); - for (i = 0; i < X509_PURPOSE_get_count(); i++) { - X509_PURPOSE *ptmp; - ptmp = X509_PURPOSE_get0(i); - BIO_printf(bio_err, "\t%-10s\t%s\n", - X509_PURPOSE_get0_sname(ptmp), - X509_PURPOSE_get0_name(ptmp)); - } - - BIO_printf(bio_err, "Recognized verify names:\n"); - for (i = 0; i < X509_VERIFY_PARAM_get_count(); i++) { - const X509_VERIFY_PARAM *vptmp; - vptmp = X509_VERIFY_PARAM_get0(i); - BIO_printf(bio_err, "\t%-10s\n", - X509_VERIFY_PARAM_get0_name(vptmp)); - } - ret = 0; - goto end; - case OPT_V_CASES: - if (!opt_verify(o, vpm)) - goto end; - vpmtouched++; - break; - case OPT_CAPATH: - CApath = opt_arg(); - break; - case OPT_CAFILE: - CAfile = opt_arg(); - break; - case OPT_NOCAPATH: - noCApath = 1; - break; - case OPT_NOCAFILE: - noCAfile = 1; - break; - case OPT_UNTRUSTED: - /* Zero or more times */ - if (!load_certs(opt_arg(), &untrusted, FORMAT_PEM, NULL, - "untrusted certificates")) - goto end; - break; - case OPT_TRUSTED: - /* Zero or more times */ - noCAfile = 1; - noCApath = 1; - if (!load_certs(opt_arg(), &trusted, FORMAT_PEM, NULL, - "trusted certificates")) - goto end; - break; - case OPT_CRLFILE: - /* Zero or more times */ - if (!load_crls(opt_arg(), &crls, FORMAT_PEM, NULL, - "other CRLs")) - goto end; - break; - case OPT_CRL_DOWNLOAD: - crl_download = 1; - break; - case OPT_ENGINE: - if ((e = setup_engine(opt_arg(), 0)) == NULL) { - /* Failure message already displayed */ - goto end; - } - break; - case OPT_SHOW_CHAIN: - show_chain = 1; - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto end; - break; - case OPT_VERBOSE: - v_verbose = 1; - break; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - if (trusted != NULL && (CAfile || CApath)) { - BIO_printf(bio_err, - "%s: Cannot use -trusted with -CAfile or -CApath\n", - prog); - goto end; - } - - if ((store = setup_verify(CAfile, CApath, noCAfile, noCApath)) == NULL) - goto end; - X509_STORE_set_verify_cb(store, cb); - - if (vpmtouched) - X509_STORE_set1_param(store, vpm); - - ERR_clear_error(); - - if (crl_download) - store_setup_crl_download(store); - - ret = 0; - if (argc < 1) { - if (check(store, NULL, untrusted, trusted, crls, show_chain) != 1) - ret = -1; - } else { - for (i = 0; i < argc; i++) - if (check(store, argv[i], untrusted, trusted, crls, - show_chain) != 1) - ret = -1; - } - - end: - X509_VERIFY_PARAM_free(vpm); - X509_STORE_free(store); - sk_X509_pop_free(untrusted, X509_free); - sk_X509_pop_free(trusted, X509_free); - sk_X509_CRL_pop_free(crls, X509_CRL_free); - release_engine(e); - return (ret < 0 ? 2 : ret); -} - -static int check(X509_STORE *ctx, const char *file, - STACK_OF(X509) *uchain, STACK_OF(X509) *tchain, - STACK_OF(X509_CRL) *crls, int show_chain) -{ - X509 *x = NULL; - int i = 0, ret = 0; - X509_STORE_CTX *csc; - STACK_OF(X509) *chain = NULL; - int num_untrusted; - - x = load_cert(file, FORMAT_PEM, "certificate file"); - if (x == NULL) - goto end; - - csc = X509_STORE_CTX_new(); - if (csc == NULL) { - printf("error %s: X.509 store context allocation failed\n", - (file == NULL) ? "stdin" : file); - goto end; - } - - X509_STORE_set_flags(ctx, vflags); - if (!X509_STORE_CTX_init(csc, ctx, x, uchain)) { - X509_STORE_CTX_free(csc); - printf("error %s: X.509 store context initialization failed\n", - (file == NULL) ? "stdin" : file); - goto end; - } - if (tchain != NULL) - X509_STORE_CTX_set0_trusted_stack(csc, tchain); - if (crls != NULL) - X509_STORE_CTX_set0_crls(csc, crls); - i = X509_verify_cert(csc); - if (i > 0 && X509_STORE_CTX_get_error(csc) == X509_V_OK) { - printf("%s: OK\n", (file == NULL) ? "stdin" : file); - ret = 1; - if (show_chain) { - int j; - - chain = X509_STORE_CTX_get1_chain(csc); - num_untrusted = X509_STORE_CTX_get_num_untrusted(csc); - printf("Chain:\n"); - for (j = 0; j < sk_X509_num(chain); j++) { - X509 *cert = sk_X509_value(chain, j); - printf("depth=%d: ", j); - X509_NAME_print_ex_fp(stdout, - X509_get_subject_name(cert), - 0, get_nameopt()); - if (j < num_untrusted) - printf(" (untrusted)"); - printf("\n"); - } - sk_X509_pop_free(chain, X509_free); - } - } else { - printf("error %s: verification failed\n", (file == NULL) ? "stdin" : file); - } - X509_STORE_CTX_free(csc); - - end: - if (i <= 0) - ERR_print_errors(bio_err); - X509_free(x); - - return ret; -} - -static int cb(int ok, X509_STORE_CTX *ctx) -{ - int cert_error = X509_STORE_CTX_get_error(ctx); - X509 *current_cert = X509_STORE_CTX_get_current_cert(ctx); - - if (!ok) { - if (current_cert != NULL) { - X509_NAME_print_ex(bio_err, - X509_get_subject_name(current_cert), - 0, get_nameopt()); - BIO_printf(bio_err, "\n"); - } - BIO_printf(bio_err, "%serror %d at %d depth lookup: %s\n", - X509_STORE_CTX_get0_parent_ctx(ctx) ? "[CRL path] " : "", - cert_error, - X509_STORE_CTX_get_error_depth(ctx), - X509_verify_cert_error_string(cert_error)); - - /* - * Pretend that some errors are ok, so they don't stop further - * processing of the certificate chain. Setting ok = 1 does this. - * After X509_verify_cert() is done, we verify that there were - * no actual errors, even if the returned value was positive. - */ - switch (cert_error) { - case X509_V_ERR_NO_EXPLICIT_POLICY: - policies_print(ctx); - /* fall thru */ - case X509_V_ERR_CERT_HAS_EXPIRED: - /* Continue even if the leaf is a self signed cert */ - case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: - /* Continue after extension errors too */ - case X509_V_ERR_INVALID_CA: - case X509_V_ERR_INVALID_NON_CA: - case X509_V_ERR_PATH_LENGTH_EXCEEDED: - case X509_V_ERR_INVALID_PURPOSE: - case X509_V_ERR_CRL_HAS_EXPIRED: - case X509_V_ERR_CRL_NOT_YET_VALID: - case X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION: - ok = 1; - } - - return ok; - - } - if (cert_error == X509_V_OK && ok == 2) - policies_print(ctx); - if (!v_verbose) - ERR_clear_error(); - return ok; -} diff --git a/contrib/libs/openssl/apps/version.c b/contrib/libs/openssl/apps/version.c deleted file mode 100644 index 2aca163615..0000000000 --- a/contrib/libs/openssl/apps/version.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/evp.h> -#include <openssl/crypto.h> -#include <openssl/bn.h> -#ifndef OPENSSL_NO_MD2 -# include <openssl/md2.h> -#endif -#ifndef OPENSSL_NO_RC4 -# include <openssl/rc4.h> -#endif -#ifndef OPENSSL_NO_DES -# include <openssl/des.h> -#endif -#ifndef OPENSSL_NO_IDEA -# include <openssl/idea.h> -#endif -#ifndef OPENSSL_NO_BF -# include <openssl/blowfish.h> -#endif - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_B, OPT_D, OPT_E, OPT_F, OPT_O, OPT_P, OPT_V, OPT_A, OPT_R -} OPTION_CHOICE; - -const OPTIONS version_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"a", OPT_A, '-', "Show all data"}, - {"b", OPT_B, '-', "Show build date"}, - {"d", OPT_D, '-', "Show configuration directory"}, - {"e", OPT_E, '-', "Show engines directory"}, - {"f", OPT_F, '-', "Show compiler flags used"}, - {"o", OPT_O, '-', "Show some internal datatype options"}, - {"p", OPT_P, '-', "Show target build platform"}, - {"r", OPT_R, '-', "Show random seeding options"}, - {"v", OPT_V, '-', "Show library version"}, - {NULL} -}; - -#if defined(OPENSSL_RAND_SEED_DEVRANDOM) || defined(OPENSSL_RAND_SEED_EGD) -static void printlist(const char *prefix, const char **dev) -{ - printf("%s (", prefix); - for ( ; *dev != NULL; dev++) - printf(" \"%s\"", *dev); - printf(" )"); -} -#endif - -int version_main(int argc, char **argv) -{ - int ret = 1, dirty = 0, seed = 0; - int cflags = 0, version = 0, date = 0, options = 0, platform = 0, dir = 0; - int engdir = 0; - char *prog; - OPTION_CHOICE o; - - prog = opt_init(argc, argv, version_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: -opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(version_options); - ret = 0; - goto end; - case OPT_B: - dirty = date = 1; - break; - case OPT_D: - dirty = dir = 1; - break; - case OPT_E: - dirty = engdir = 1; - break; - case OPT_F: - dirty = cflags = 1; - break; - case OPT_O: - dirty = options = 1; - break; - case OPT_P: - dirty = platform = 1; - break; - case OPT_R: - dirty = seed = 1; - break; - case OPT_V: - dirty = version = 1; - break; - case OPT_A: - seed = options = cflags = version = date = platform = dir = engdir - = 1; - break; - } - } - if (opt_num_rest() != 0) { - BIO_printf(bio_err, "Extra parameters given.\n"); - goto opthelp; - } - if (!dirty) - version = 1; - - if (version) { - if (OpenSSL_version_num() == OPENSSL_VERSION_NUMBER) - printf("%s\n", OpenSSL_version(OPENSSL_VERSION)); - else - printf("%s (Library: %s)\n", - OPENSSL_VERSION_TEXT, OpenSSL_version(OPENSSL_VERSION)); - } - if (date) - printf("%s\n", OpenSSL_version(OPENSSL_BUILT_ON)); - if (platform) - printf("%s\n", OpenSSL_version(OPENSSL_PLATFORM)); - if (options) { - printf("options: "); - printf("%s ", BN_options()); -#ifndef OPENSSL_NO_MD2 - printf("%s ", MD2_options()); -#endif -#ifndef OPENSSL_NO_RC4 - printf("%s ", RC4_options()); -#endif -#ifndef OPENSSL_NO_DES - printf("%s ", DES_options()); -#endif -#ifndef OPENSSL_NO_IDEA - printf("%s ", IDEA_options()); -#endif -#ifndef OPENSSL_NO_BF - printf("%s ", BF_options()); -#endif - printf("\n"); - } - if (cflags) - printf("%s\n", OpenSSL_version(OPENSSL_CFLAGS)); - if (dir) - printf("%s\n", OpenSSL_version(OPENSSL_DIR)); - if (engdir) - printf("%s\n", OpenSSL_version(OPENSSL_ENGINES_DIR)); - if (seed) { - printf("Seeding source:"); -#ifdef OPENSSL_RAND_SEED_RTDSC - printf(" rtdsc"); -#endif -#ifdef OPENSSL_RAND_SEED_RDCPU - printf(" rdrand ( rdseed rdrand )"); -#endif -#ifdef OPENSSL_RAND_SEED_LIBRANDOM - printf(" C-library-random"); -#endif -#ifdef OPENSSL_RAND_SEED_GETRANDOM - printf(" getrandom-syscall"); -#endif -#ifdef OPENSSL_RAND_SEED_DEVRANDOM - { - static const char *dev[] = { DEVRANDOM, NULL }; - printlist(" random-device", dev); - } -#endif -#ifdef OPENSSL_RAND_SEED_EGD - { - static const char *dev[] = { DEVRANDOM_EGD, NULL }; - printlist(" EGD", dev); - } -#endif -#ifdef OPENSSL_RAND_SEED_NONE - printf(" none"); -#endif -#ifdef OPENSSL_RAND_SEED_OS - printf(" os-specific"); -#endif - printf("\n"); - } - ret = 0; - end: - return ret; -} diff --git a/contrib/libs/openssl/apps/vms_decc_init.c b/contrib/libs/openssl/apps/vms_decc_init.c deleted file mode 100644 index f83f7168ef..0000000000 --- a/contrib/libs/openssl/apps/vms_decc_init.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#if defined( __VMS) && !defined( OPENSSL_NO_DECC_INIT) && \ - defined( __DECC) && !defined( __VAX) && (__CRTL_VER >= 70301000) -# define USE_DECC_INIT 1 -#endif - -#ifdef USE_DECC_INIT - -/* - * ---------------------------------------------------------------------- - * decc_init() On non-VAX systems, uses LIB$INITIALIZE to set a collection - * of C RTL features without using the DECC$* logical name method. - * ---------------------------------------------------------------------- - */ - -# include <stdio.h> -# include <stdlib.h> -# include <unixlib.h> - -# include "apps.h" - -/* Global storage. */ - -/* Flag to sense if decc_init() was called. */ - -int decc_init_done = -1; - -/* Structure to hold a DECC$* feature name and its desired value. */ - -typedef struct { - char *name; - int value; -} decc_feat_t; - -/* - * Array of DECC$* feature names and their desired values. Note: - * DECC$ARGV_PARSE_STYLE is the urgent one. - */ - -decc_feat_t decc_feat_array[] = { - /* Preserve command-line case with SET PROCESS/PARSE_STYLE=EXTENDED */ - {"DECC$ARGV_PARSE_STYLE", 1}, - - /* Preserve case for file names on ODS5 disks. */ - {"DECC$EFS_CASE_PRESERVE", 1}, - - /* - * Enable multiple dots (and most characters) in ODS5 file names, while - * preserving VMS-ness of ";version". - */ - {"DECC$EFS_CHARSET", 1}, - - /* List terminator. */ - {(char *)NULL, 0} -}; - - -char **copy_argv(int *argc, char *argv[]) -{ - /*- - * The note below is for historical purpose. On VMS now we always - * copy argv "safely." - * - * 2011-03-22 SMS. - * If we have 32-bit pointers everywhere, then we're safe, and - * we bypass this mess, as on non-VMS systems. - * Problem 1: Compaq/HP C before V7.3 always used 32-bit - * pointers for argv[]. - * Fix 1: For a 32-bit argv[], when we're using 64-bit pointers - * everywhere else, we always allocate and use a 64-bit - * duplicate of argv[]. - * Problem 2: Compaq/HP C V7.3 (Alpha, IA64) before ECO1 failed - * to NULL-terminate a 64-bit argv[]. (As this was written, the - * compiler ECO was available only on IA64.) - * Fix 2: Unless advised not to (VMS_TRUST_ARGV), we test a - * 64-bit argv[argc] for NULL, and, if necessary, use a - * (properly) NULL-terminated (64-bit) duplicate of argv[]. - * The same code is used in either case to duplicate argv[]. - * Some of these decisions could be handled in preprocessing, - * but the code tends to get even uglier, and the penalty for - * deciding at compile- or run-time is tiny. - */ - - int i, count = *argc; - char **newargv = app_malloc(sizeof(*newargv) * (count + 1), "argv copy"); - - for (i = 0; i < count; i++) - newargv[i] = argv[i]; - newargv[i] = NULL; - *argc = i; - return newargv; -} - -/* LIB$INITIALIZE initialization function. */ - -static void decc_init(void) -{ - char *openssl_debug_decc_init; - int verbose = 0; - int feat_index; - int feat_value; - int feat_value_max; - int feat_value_min; - int i; - int sts; - - /* Get debug option. */ - openssl_debug_decc_init = getenv("OPENSSL_DEBUG_DECC_INIT"); - if (openssl_debug_decc_init != NULL) { - verbose = strtol(openssl_debug_decc_init, NULL, 10); - if (verbose <= 0) { - verbose = 1; - } - } - - /* Set the global flag to indicate that LIB$INITIALIZE worked. */ - decc_init_done = 1; - - /* Loop through all items in the decc_feat_array[]. */ - - for (i = 0; decc_feat_array[i].name != NULL; i++) { - /* Get the feature index. */ - feat_index = decc$feature_get_index(decc_feat_array[i].name); - if (feat_index >= 0) { - /* Valid item. Collect its properties. */ - feat_value = decc$feature_get_value(feat_index, 1); - feat_value_min = decc$feature_get_value(feat_index, 2); - feat_value_max = decc$feature_get_value(feat_index, 3); - - /* Check the validity of our desired value. */ - if ((decc_feat_array[i].value >= feat_value_min) && - (decc_feat_array[i].value <= feat_value_max)) { - /* Valid value. Set it if necessary. */ - if (feat_value != decc_feat_array[i].value) { - sts = decc$feature_set_value(feat_index, - 1, decc_feat_array[i].value); - - if (verbose > 1) { - fprintf(stderr, " %s = %d, sts = %d.\n", - decc_feat_array[i].name, - decc_feat_array[i].value, sts); - } - } - } else { - /* Invalid DECC feature value. */ - fprintf(stderr, - " INVALID DECC$FEATURE VALUE, %d: %d <= %s <= %d.\n", - feat_value, - feat_value_min, decc_feat_array[i].name, - feat_value_max); - } - } else { - /* Invalid DECC feature name. */ - fprintf(stderr, - " UNKNOWN DECC$FEATURE: %s.\n", decc_feat_array[i].name); - } - } - - if (verbose > 0) { - fprintf(stderr, " DECC_INIT complete.\n"); - } -} - -/* Get "decc_init()" into a valid, loaded LIB$INITIALIZE PSECT. */ - -# pragma nostandard - -/* - * Establish the LIB$INITIALIZE PSECTs, with proper alignment and other - * attributes. Note that "nopic" is significant only on VAX. - */ -# pragma extern_model save - -# if __INITIAL_POINTER_SIZE == 64 -# define PSECT_ALIGN 3 -# else -# define PSECT_ALIGN 2 -# endif - -# pragma extern_model strict_refdef "LIB$INITIALIZ" PSECT_ALIGN, nopic, nowrt -const int spare[8] = { 0 }; - -# pragma extern_model strict_refdef "LIB$INITIALIZE" PSECT_ALIGN, nopic, nowrt -void (*const x_decc_init) () = decc_init; - -# pragma extern_model restore - -/* Fake reference to ensure loading the LIB$INITIALIZE PSECT. */ - -# pragma extern_model save - -int LIB$INITIALIZE(void); - -# pragma extern_model strict_refdef -int dmy_lib$initialize = (int)LIB$INITIALIZE; - -# pragma extern_model restore - -# pragma standard - -#else /* def USE_DECC_INIT */ - -/* Dummy code to avoid a %CC-W-EMPTYFILE complaint. */ -int decc_init_dummy(void); - -#endif /* def USE_DECC_INIT */ diff --git a/contrib/libs/openssl/apps/vms_term_sock.c b/contrib/libs/openssl/apps/vms_term_sock.c deleted file mode 100644 index 1dc4b155aa..0000000000 --- a/contrib/libs/openssl/apps/vms_term_sock.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. - * Copyright 2016 VMS Software, Inc. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#ifdef __VMS -# define OPENSSL_SYS_VMS -# pragma message disable DOLLARID - - -# include <openssl/opensslconf.h> - -# if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS) -/* - * On VMS, you need to define this to get the declaration of fileno(). The - * value 2 is to make sure no function defined in POSIX-2 is left undefined. - */ -# define _POSIX_C_SOURCE 2 -# endif - -# include <stdio.h> - -# undef _POSIX_C_SOURCE - -# include <sys/types.h> -# include <sys/socket.h> -# include <netinet/in.h> -# include <inet.h> -# include <unistd.h> -# include <string.h> -# include <errno.h> -# include <starlet.h> -# include <iodef.h> -# ifdef __alpha -# error #include <iosbdef.h> -# else -typedef struct _iosb { /* Copied from IOSBDEF.H for Alpha */ -# pragma __nomember_alignment - __union { - __struct { - unsigned short int iosb$w_status; /* Final I/O status */ - __union { - __struct { /* 16-bit byte count variant */ - unsigned short int iosb$w_bcnt; /* 16-bit byte count */ - __union { - unsigned int iosb$l_dev_depend; /* 32-bit device dependent info */ - unsigned int iosb$l_pid; /* 32-bit pid */ - } iosb$r_l; - } iosb$r_bcnt_16; - __struct { /* 32-bit byte count variant */ - unsigned int iosb$l_bcnt; /* 32-bit byte count (unaligned) */ - unsigned short int iosb$w_dev_depend_high; /* 16-bit device dependent info */ - } iosb$r_bcnt_32; - } iosb$r_devdepend; - } iosb$r_io_64; - __struct { - __union { - unsigned int iosb$l_getxxi_status; /* Final GETxxI status */ - unsigned int iosb$l_reg_status; /* Final $Registry status */ - } iosb$r_l_status; - unsigned int iosb$l_reserved; /* Reserved field */ - } iosb$r_get_64; - } iosb$r_io_get; -} IOSB; - -# if !defined(__VAXC) -# define iosb$w_status iosb$r_io_get.iosb$r_io_64.iosb$w_status -# define iosb$w_bcnt iosb$r_io_get.iosb$r_io_64.iosb$r_devdepend.iosb$r_bcnt_16.iosb$w_bcnt -# define iosb$r_l iosb$r_io_get.iosb$r_io_64.iosb$r_devdepend.iosb$r_bcnt_16.iosb$r_l -# define iosb$l_dev_depend iosb$r_l.iosb$l_dev_depend -# define iosb$l_pid iosb$r_l.iosb$l_pid -# define iosb$l_bcnt iosb$r_io_get.iosb$r_io_64.iosb$r_devdepend.iosb$r_bcnt_32.iosb$l_bcnt -# define iosb$w_dev_depend_high iosb$r_io_get.iosb$r_io_64.iosb$r_devdepend.iosb$r_bcnt_32.iosb$w_dev_depend_high -# define iosb$l_getxxi_status iosb$r_io_get.iosb$r_get_64.iosb$r_l_status.iosb$l_getxxi_status -# define iosb$l_reg_status iosb$r_io_get.iosb$r_get_64.iosb$r_l_status.iosb$l_reg_status -# endif /* #if !defined(__VAXC) */ - -# endif /* End of IOSBDEF */ - -# error #include <efndef.h> -# include <stdlib.h> -# include <ssdef.h> -# include <time.h> -# include <stdarg.h> -# include <descrip.h> - -# include "vms_term_sock.h" - -# ifdef __alpha -static struct _iosb TerminalDeviceIosb; -# else -IOSB TerminalDeviceIosb; -# endif - -static char TerminalDeviceBuff[255 + 2]; -static int TerminalSocketPair[2] = {0, 0}; -static unsigned short TerminalDeviceChan = 0; - -static int CreateSocketPair (int, int, int, int *); -static void SocketPairTimeoutAst (int); -static int TerminalDeviceAst (int); -static void LogMessage (char *, ...); - -/* -** Socket Pair Timeout Value (must be 0-59 seconds) -*/ -# define SOCKET_PAIR_TIMEOUT_VALUE 20 - -/* -** Socket Pair Timeout Block which is passed to timeout AST -*/ -typedef struct _SocketPairTimeoutBlock { - unsigned short SockChan1; - unsigned short SockChan2; -} SPTB; - -# ifdef TERM_SOCK_TEST - -/*----------------------------------------------------------------------------*/ -/* */ -/*----------------------------------------------------------------------------*/ -int main (int argc, char *argv[], char *envp[]) -{ - char TermBuff[80]; - int TermSock, - status, - len; - - LogMessage ("Enter 'q' or 'Q' to quit ..."); - while (strcasecmp (TermBuff, "Q")) { - /* - ** Create the terminal socket - */ - status = TerminalSocket (TERM_SOCK_CREATE, &TermSock); - if (status != TERM_SOCK_SUCCESS) - exit (1); - - /* - ** Process the terminal input - */ - LogMessage ("Waiting on terminal I/O ...\n"); - len = recv (TermSock, TermBuff, sizeof(TermBuff), 0) ; - TermBuff[len] = '\0'; - LogMessage ("Received terminal I/O [%s]", TermBuff); - - /* - ** Delete the terminal socket - */ - status = TerminalSocket (TERM_SOCK_DELETE, &TermSock); - if (status != TERM_SOCK_SUCCESS) - exit (1); - } - - return 1; - -} -# endif - -/*----------------------------------------------------------------------------*/ -/* */ -/*----------------------------------------------------------------------------*/ -int TerminalSocket (int FunctionCode, int *ReturnSocket) -{ - int status; - $DESCRIPTOR (TerminalDeviceDesc, "SYS$COMMAND"); - - /* - ** Process the requested function code - */ - switch (FunctionCode) { - case TERM_SOCK_CREATE: - /* - ** Create a socket pair - */ - status = CreateSocketPair (AF_INET, SOCK_STREAM, 0, TerminalSocketPair); - if (status == -1) { - LogMessage ("TerminalSocket: CreateSocketPair () - %08X", status); - if (TerminalSocketPair[0]) - close (TerminalSocketPair[0]); - if (TerminalSocketPair[1]) - close (TerminalSocketPair[1]); - return TERM_SOCK_FAILURE; - } - - /* - ** Assign a channel to the terminal device - */ - status = sys$assign (&TerminalDeviceDesc, - &TerminalDeviceChan, - 0, 0, 0); - if (! (status & 1)) { - LogMessage ("TerminalSocket: SYS$ASSIGN () - %08X", status); - close (TerminalSocketPair[0]); - close (TerminalSocketPair[1]); - return TERM_SOCK_FAILURE; - } - - /* - ** Queue an async IO to the terminal device - */ - status = sys$qio (EFN$C_ENF, - TerminalDeviceChan, - IO$_READVBLK, - &TerminalDeviceIosb, - TerminalDeviceAst, - 0, - TerminalDeviceBuff, - sizeof(TerminalDeviceBuff) - 2, - 0, 0, 0, 0); - if (! (status & 1)) { - LogMessage ("TerminalSocket: SYS$QIO () - %08X", status); - close (TerminalSocketPair[0]); - close (TerminalSocketPair[1]); - return TERM_SOCK_FAILURE; - } - - /* - ** Return the input side of the socket pair - */ - *ReturnSocket = TerminalSocketPair[1]; - break; - - case TERM_SOCK_DELETE: - /* - ** Cancel any pending IO on the terminal channel - */ - status = sys$cancel (TerminalDeviceChan); - if (! (status & 1)) { - LogMessage ("TerminalSocket: SYS$CANCEL () - %08X", status); - close (TerminalSocketPair[0]); - close (TerminalSocketPair[1]); - return TERM_SOCK_FAILURE; - } - - /* - ** Deassign the terminal channel - */ - status = sys$dassgn (TerminalDeviceChan); - if (! (status & 1)) { - LogMessage ("TerminalSocket: SYS$DASSGN () - %08X", status); - close (TerminalSocketPair[0]); - close (TerminalSocketPair[1]); - return TERM_SOCK_FAILURE; - } - - /* - ** Close the terminal socket pair - */ - close (TerminalSocketPair[0]); - close (TerminalSocketPair[1]); - - /* - ** Return the initialized socket - */ - *ReturnSocket = 0; - break; - - default: - /* - ** Invalid function code - */ - LogMessage ("TerminalSocket: Invalid Function Code - %d", FunctionCode); - return TERM_SOCK_FAILURE; - break; - } - - /* - ** Return success - */ - return TERM_SOCK_SUCCESS; - -} - -/*----------------------------------------------------------------------------*/ -/* */ -/*----------------------------------------------------------------------------*/ -static int CreateSocketPair (int SocketFamily, - int SocketType, - int SocketProtocol, - int *SocketPair) -{ - struct dsc$descriptor AscTimeDesc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL}; - static const char* LocalHostAddr = {"127.0.0.1"}; - unsigned short TcpAcceptChan = 0, - TcpDeviceChan = 0; - unsigned long BinTimeBuff[2]; - struct sockaddr_in sin; - char AscTimeBuff[32]; - short LocalHostPort; - int status; - unsigned int slen; - -# ifdef __alpha - struct _iosb iosb; -# else - IOSB iosb; -# endif - - int SockDesc1 = 0, - SockDesc2 = 0; - SPTB sptb; - $DESCRIPTOR (TcpDeviceDesc, "TCPIP$DEVICE"); - - /* - ** Create a socket - */ - SockDesc1 = socket (SocketFamily, SocketType, 0); - if (SockDesc1 < 0) { - LogMessage ("CreateSocketPair: socket () - %d", errno); - return -1; - } - - /* - ** Initialize the socket information - */ - slen = sizeof(sin); - memset ((char *) &sin, 0, slen); - sin.sin_family = SocketFamily; - sin.sin_addr.s_addr = inet_addr (LocalHostAddr); - sin.sin_port = 0; - - /* - ** Bind the socket to the local IP - */ - status = bind (SockDesc1, (struct sockaddr *) &sin, slen); - if (status < 0) { - LogMessage ("CreateSocketPair: bind () - %d", errno); - close (SockDesc1); - return -1; - } - - /* - ** Get the socket name so we can save the port number - */ - status = getsockname (SockDesc1, (struct sockaddr *) &sin, &slen); - if (status < 0) { - LogMessage ("CreateSocketPair: getsockname () - %d", errno); - close (SockDesc1); - return -1; - } else - LocalHostPort = sin.sin_port; - - /* - ** Setup a listen for the socket - */ - listen (SockDesc1, 5); - - /* - ** Get the binary (64-bit) time of the specified timeout value - */ - sprintf (AscTimeBuff, "0 0:0:%02d.00", SOCKET_PAIR_TIMEOUT_VALUE); - AscTimeDesc.dsc$w_length = strlen (AscTimeBuff); - AscTimeDesc.dsc$a_pointer = AscTimeBuff; - status = sys$bintim (&AscTimeDesc, BinTimeBuff); - if (! (status & 1)) { - LogMessage ("CreateSocketPair: SYS$BINTIM () - %08X", status); - close (SockDesc1); - return -1; - } - - /* - ** Assign another channel to the TCP/IP device for the accept. - ** This is the channel that ends up being connected to. - */ - status = sys$assign (&TcpDeviceDesc, &TcpDeviceChan, 0, 0, 0); - if (! (status & 1)) { - LogMessage ("CreateSocketPair: SYS$ASSIGN () - %08X", status); - close (SockDesc1); - return -1; - } - - /* - ** Get the channel of the first socket for the accept - */ - TcpAcceptChan = decc$get_sdc (SockDesc1); - - /* - ** Perform the accept using $QIO so we can do this asynchronously - */ - status = sys$qio (EFN$C_ENF, - TcpAcceptChan, - IO$_ACCESS | IO$M_ACCEPT, - &iosb, - 0, 0, 0, 0, 0, - &TcpDeviceChan, - 0, 0); - if (! (status & 1)) { - LogMessage ("CreateSocketPair: SYS$QIO () - %08X", status); - close (SockDesc1); - sys$dassgn (TcpDeviceChan); - return -1; - } - - /* - ** Create the second socket to do the connect - */ - SockDesc2 = socket (SocketFamily, SocketType, 0); - if (SockDesc2 < 0) { - LogMessage ("CreateSocketPair: socket () - %d", errno); - sys$cancel (TcpAcceptChan); - close (SockDesc1); - sys$dassgn (TcpDeviceChan); - return (-1) ; - } - - /* - ** Setup the Socket Pair Timeout Block - */ - sptb.SockChan1 = TcpAcceptChan; - sptb.SockChan2 = decc$get_sdc (SockDesc2); - - /* - ** Before we block on the connect, set a timer that can cancel I/O on our - ** two sockets if it never connects. - */ - status = sys$setimr (EFN$C_ENF, - BinTimeBuff, - SocketPairTimeoutAst, - &sptb, - 0); - if (! (status & 1)) { - LogMessage ("CreateSocketPair: SYS$SETIMR () - %08X", status); - sys$cancel (TcpAcceptChan); - close (SockDesc1); - close (SockDesc2); - sys$dassgn (TcpDeviceChan); - return -1; - } - - /* - ** Now issue the connect - */ - memset ((char *) &sin, 0, sizeof(sin)) ; - sin.sin_family = SocketFamily; - sin.sin_addr.s_addr = inet_addr (LocalHostAddr) ; - sin.sin_port = LocalHostPort ; - - status = connect (SockDesc2, (struct sockaddr *) &sin, sizeof(sin)); - if (status < 0 ) { - LogMessage ("CreateSocketPair: connect () - %d", errno); - sys$cantim (&sptb, 0); - sys$cancel (TcpAcceptChan); - close (SockDesc1); - close (SockDesc2); - sys$dassgn (TcpDeviceChan); - return -1; - } - - /* - ** Wait for the asynch $QIO to finish. Note that if the I/O was aborted - ** (SS$_ABORT), then we probably canceled it from the AST routine - so log - ** a timeout. - */ - status = sys$synch (EFN$C_ENF, &iosb); - if (! (iosb.iosb$w_status & 1)) { - if (iosb.iosb$w_status == SS$_ABORT) - LogMessage ("CreateSocketPair: SYS$QIO(iosb) timeout"); - else { - LogMessage ("CreateSocketPair: SYS$QIO(iosb) - %d", - iosb.iosb$w_status); - sys$cantim (&sptb, 0); - } - close (SockDesc1); - close (SockDesc2); - sys$dassgn (TcpDeviceChan); - return -1; - } - - /* - ** Here we're successfully connected, so cancel the timer, convert the - ** I/O channel to a socket fd, close the listener socket and return the - ** connected pair. - */ - sys$cantim (&sptb, 0); - - close (SockDesc1) ; - SocketPair[0] = SockDesc2 ; - SocketPair[1] = socket_fd (TcpDeviceChan); - - return (0) ; - -} - -/*----------------------------------------------------------------------------*/ -/* */ -/*----------------------------------------------------------------------------*/ -static void SocketPairTimeoutAst (int astparm) -{ - SPTB *sptb = (SPTB *) astparm; - - sys$cancel (sptb->SockChan2); /* Cancel the connect() */ - sys$cancel (sptb->SockChan1); /* Cancel the accept() */ - - return; - -} - -/*----------------------------------------------------------------------------*/ -/* */ -/*----------------------------------------------------------------------------*/ -static int TerminalDeviceAst (int astparm) -{ - int status; - - /* - ** Terminate the terminal buffer - */ - TerminalDeviceBuff[TerminalDeviceIosb.iosb$w_bcnt] = '\0'; - strcat (TerminalDeviceBuff, "\n"); - - /* - ** Send the data read from the terminal device through the socket pair - */ - send (TerminalSocketPair[0], TerminalDeviceBuff, - TerminalDeviceIosb.iosb$w_bcnt + 1, 0); - - /* - ** Queue another async IO to the terminal device - */ - status = sys$qio (EFN$C_ENF, - TerminalDeviceChan, - IO$_READVBLK, - &TerminalDeviceIosb, - TerminalDeviceAst, - 0, - TerminalDeviceBuff, - sizeof(TerminalDeviceBuff) - 1, - 0, 0, 0, 0); - - /* - ** Return status - */ - return status; - -} - -/*----------------------------------------------------------------------------*/ -/* */ -/*----------------------------------------------------------------------------*/ -static void LogMessage (char *msg, ...) -{ - char *Month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - static unsigned int pid = 0; - va_list args; - time_t CurTime; - struct tm *LocTime; - char MsgBuff[256]; - - /* - ** Get the process pid - */ - if (pid == 0) - pid = getpid (); - - /* - ** Convert the current time into local time - */ - CurTime = time (NULL); - LocTime = localtime (&CurTime); - - /* - ** Format the message buffer - */ - sprintf (MsgBuff, "%02d-%s-%04d %02d:%02d:%02d [%08X] %s\n", - LocTime->tm_mday, Month[LocTime->tm_mon], - (LocTime->tm_year + 1900), LocTime->tm_hour, LocTime->tm_min, - LocTime->tm_sec, pid, msg); - - /* - ** Get any variable arguments and add them to the print of the message - ** buffer - */ - va_start (args, msg); - vfprintf (stderr, MsgBuff, args); - va_end (args); - - /* - ** Flush standard error output - */ - fsync (fileno (stderr)); - - return; - -} -#endif diff --git a/contrib/libs/openssl/apps/vms_term_sock.h b/contrib/libs/openssl/apps/vms_term_sock.h deleted file mode 100644 index e092b18eaa..0000000000 --- a/contrib/libs/openssl/apps/vms_term_sock.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. - * Copyright 2016 VMS Software, Inc. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#ifndef OSSL_APPS_VMS_TERM_SOCK_H -# define OSSL_APPS_VMS_TERM_SOCK_H - -/* -** Terminal Socket Function Codes -*/ -# define TERM_SOCK_CREATE 1 -# define TERM_SOCK_DELETE 2 - -/* -** Terminal Socket Status Codes -*/ -# define TERM_SOCK_FAILURE 0 -# define TERM_SOCK_SUCCESS 1 - -/* -** Terminal Socket Prototype -*/ -int TerminalSocket (int FunctionCode, int *ReturnSocket); - -#endif diff --git a/contrib/libs/openssl/apps/win32_init.c b/contrib/libs/openssl/apps/win32_init.c deleted file mode 100644 index df4bff41a2..0000000000 --- a/contrib/libs/openssl/apps/win32_init.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <windows.h> -#include <stdlib.h> -#include <string.h> -#include <malloc.h> - -#if defined(CP_UTF8) - -static UINT saved_cp; -static int newargc; -static char **newargv; - -static void cleanup(void) -{ - int i; - - SetConsoleOutputCP(saved_cp); - - for (i = 0; i < newargc; i++) - free(newargv[i]); - - free(newargv); -} - -/* - * Incrementally [re]allocate newargv and keep it NULL-terminated. - */ -static int validate_argv(int argc) -{ - static int size = 0; - - if (argc >= size) { - char **ptr; - - while (argc >= size) - size += 64; - - ptr = realloc(newargv, size * sizeof(newargv[0])); - if (ptr == NULL) - return 0; - - (newargv = ptr)[argc] = NULL; - } else { - newargv[argc] = NULL; - } - - return 1; -} - -static int process_glob(WCHAR *wstr, int wlen) -{ - int i, slash, udlen; - WCHAR saved_char; - WIN32_FIND_DATAW data; - HANDLE h; - - /* - * Note that we support wildcard characters only in filename part - * of the path, and not in directories. Windows users are used to - * this, that's why recursive glob processing is not implemented. - */ - /* - * Start by looking for last slash or backslash, ... - */ - for (slash = 0, i = 0; i < wlen; i++) - if (wstr[i] == L'/' || wstr[i] == L'\\') - slash = i + 1; - /* - * ... then look for asterisk or question mark in the file name. - */ - for (i = slash; i < wlen; i++) - if (wstr[i] == L'*' || wstr[i] == L'?') - break; - - if (i == wlen) - return 0; /* definitely not a glob */ - - saved_char = wstr[wlen]; - wstr[wlen] = L'\0'; - h = FindFirstFileW(wstr, &data); - wstr[wlen] = saved_char; - if (h == INVALID_HANDLE_VALUE) - return 0; /* not a valid glob, just pass... */ - - if (slash) - udlen = WideCharToMultiByte(CP_UTF8, 0, wstr, slash, - NULL, 0, NULL, NULL); - else - udlen = 0; - - do { - int uflen; - char *arg; - - /* - * skip over . and .. - */ - if (data.cFileName[0] == L'.') { - if ((data.cFileName[1] == L'\0') || - (data.cFileName[1] == L'.' && data.cFileName[2] == L'\0')) - continue; - } - - if (!validate_argv(newargc + 1)) - break; - - /* - * -1 below means "scan for trailing '\0' *and* count it", - * so that |uflen| covers even trailing '\0'. - */ - uflen = WideCharToMultiByte(CP_UTF8, 0, data.cFileName, -1, - NULL, 0, NULL, NULL); - - arg = malloc(udlen + uflen); - if (arg == NULL) - break; - - if (udlen) - WideCharToMultiByte(CP_UTF8, 0, wstr, slash, - arg, udlen, NULL, NULL); - - WideCharToMultiByte(CP_UTF8, 0, data.cFileName, -1, - arg + udlen, uflen, NULL, NULL); - - newargv[newargc++] = arg; - } while (FindNextFileW(h, &data)); - - CloseHandle(h); - - return 1; -} - -void win32_utf8argv(int *argc, char **argv[]) -{ - const WCHAR *wcmdline; - WCHAR *warg, *wend, *p; - int wlen, ulen, valid = 1; - char *arg; - - if (GetEnvironmentVariableW(L"OPENSSL_WIN32_UTF8", NULL, 0) == 0) - return; - - newargc = 0; - newargv = NULL; - if (!validate_argv(newargc)) - return; - - wcmdline = GetCommandLineW(); - if (wcmdline == NULL) return; - - /* - * make a copy of the command line, since we might have to modify it... - */ - wlen = wcslen(wcmdline); - p = _alloca((wlen + 1) * sizeof(WCHAR)); - wcscpy(p, wcmdline); - - while (*p != L'\0') { - int in_quote = 0; - - if (*p == L' ' || *p == L'\t') { - p++; /* skip over white spaces */ - continue; - } - - /* - * Note: because we may need to fiddle with the number of backslashes, - * the argument string is copied into itself. This is safe because - * the number of characters will never expand. - */ - warg = wend = p; - while (*p != L'\0' - && (in_quote || (*p != L' ' && *p != L'\t'))) { - switch (*p) { - case L'\\': - /* - * Microsoft documentation on how backslashes are treated - * is: - * - * + Backslashes are interpreted literally, unless they - * immediately precede a double quotation mark. - * + If an even number of backslashes is followed by a double - * quotation mark, one backslash is placed in the argv array - * for every pair of backslashes, and the double quotation - * mark is interpreted as a string delimiter. - * + If an odd number of backslashes is followed by a double - * quotation mark, one backslash is placed in the argv array - * for every pair of backslashes, and the double quotation - * mark is "escaped" by the remaining backslash, causing a - * literal double quotation mark (") to be placed in argv. - * - * Ref: https://msdn.microsoft.com/en-us/library/17w5ykft.aspx - * - * Though referred page doesn't mention it, multiple qouble - * quotes are also special. Pair of double quotes in quoted - * string is counted as single double quote. - */ - { - const WCHAR *q = p; - int i; - - while (*p == L'\\') - p++; - - if (*p == L'"') { - int i; - - for (i = (p - q) / 2; i > 0; i--) - *wend++ = L'\\'; - - /* - * if odd amount of backslashes before the quote, - * said quote is part of the argument, not a delimiter - */ - if ((p - q) % 2 == 1) - *wend++ = *p++; - } else { - for (i = p - q; i > 0; i--) - *wend++ = L'\\'; - } - } - break; - case L'"': - /* - * Without the preceding backslash (or when preceded with an - * even number of backslashes), the double quote is a simple - * string delimiter and just slightly change the parsing state - */ - if (in_quote && p[1] == L'"') - *wend++ = *p++; - else - in_quote = !in_quote; - p++; - break; - default: - /* - * Any other non-delimiter character is just taken verbatim - */ - *wend++ = *p++; - } - } - - wlen = wend - warg; - - if (wlen == 0 || !process_glob(warg, wlen)) { - if (!validate_argv(newargc + 1)) { - valid = 0; - break; - } - - ulen = 0; - if (wlen > 0) { - ulen = WideCharToMultiByte(CP_UTF8, 0, warg, wlen, - NULL, 0, NULL, NULL); - if (ulen <= 0) - continue; - } - - arg = malloc(ulen + 1); - if (arg == NULL) { - valid = 0; - break; - } - - if (wlen > 0) - WideCharToMultiByte(CP_UTF8, 0, warg, wlen, - arg, ulen, NULL, NULL); - arg[ulen] = '\0'; - - newargv[newargc++] = arg; - } - } - - if (valid) { - saved_cp = GetConsoleOutputCP(); - SetConsoleOutputCP(CP_UTF8); - - *argc = newargc; - *argv = newargv; - - atexit(cleanup); - } else if (newargv != NULL) { - int i; - - for (i = 0; i < newargc; i++) - free(newargv[i]); - - free(newargv); - - newargc = 0; - newargv = NULL; - } - - return; -} -#else -void win32_utf8argv(int *argc, char **argv[]) -{ return; } -#endif diff --git a/contrib/libs/openssl/apps/x509.c b/contrib/libs/openssl/apps/x509.c deleted file mode 100644 index 1043eba0c8..0000000000 --- a/contrib/libs/openssl/apps/x509.c +++ /dev/null @@ -1,1196 +0,0 @@ -/* - * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the OpenSSL license (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "apps.h" -#include "progs.h" -#include <openssl/bio.h> -#include <openssl/asn1.h> -#include <openssl/err.h> -#include <openssl/bn.h> -#include <openssl/evp.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/objects.h> -#include <openssl/pem.h> -#ifndef OPENSSL_NO_RSA -# include <openssl/rsa.h> -#endif -#ifndef OPENSSL_NO_DSA -# include <openssl/dsa.h> -#endif - -#undef POSTFIX -#define POSTFIX ".srl" -#define DEF_DAYS 30 - -static int callb(int ok, X509_STORE_CTX *ctx); -static int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, - const EVP_MD *digest, CONF *conf, const char *section, - int preserve_dates); -static int x509_certify(X509_STORE *ctx, const char *CAfile, const EVP_MD *digest, - X509 *x, X509 *xca, EVP_PKEY *pkey, - STACK_OF(OPENSSL_STRING) *sigopts, const char *serialfile, - int create, int days, int clrext, CONF *conf, - const char *section, ASN1_INTEGER *sno, int reqfile, - int preserve_dates); -static int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt); -static int print_x509v3_exts(BIO *bio, X509 *x, const char *exts); - -typedef enum OPTION_choice { - OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_KEYFORM, OPT_REQ, OPT_CAFORM, - OPT_CAKEYFORM, OPT_SIGOPT, OPT_DAYS, OPT_PASSIN, OPT_EXTFILE, - OPT_EXTENSIONS, OPT_IN, OPT_OUT, OPT_SIGNKEY, OPT_CA, - OPT_CAKEY, OPT_CASERIAL, OPT_SET_SERIAL, OPT_FORCE_PUBKEY, - OPT_ADDTRUST, OPT_ADDREJECT, OPT_SETALIAS, OPT_CERTOPT, OPT_NAMEOPT, - OPT_C, OPT_EMAIL, OPT_OCSP_URI, OPT_SERIAL, OPT_NEXT_SERIAL, - OPT_MODULUS, OPT_PUBKEY, OPT_X509TOREQ, OPT_TEXT, OPT_HASH, - OPT_ISSUER_HASH, OPT_SUBJECT, OPT_ISSUER, OPT_FINGERPRINT, OPT_DATES, - OPT_PURPOSE, OPT_STARTDATE, OPT_ENDDATE, OPT_CHECKEND, OPT_CHECKHOST, - OPT_CHECKEMAIL, OPT_CHECKIP, OPT_NOOUT, OPT_TRUSTOUT, OPT_CLRTRUST, - OPT_CLRREJECT, OPT_ALIAS, OPT_CACREATESERIAL, OPT_CLREXT, OPT_OCSPID, - OPT_SUBJECT_HASH_OLD, - OPT_ISSUER_HASH_OLD, - OPT_BADSIG, OPT_MD, OPT_ENGINE, OPT_NOCERT, OPT_PRESERVE_DATES, - OPT_R_ENUM, OPT_EXT -} OPTION_CHOICE; - -const OPTIONS x509_options[] = { - {"help", OPT_HELP, '-', "Display this summary"}, - {"inform", OPT_INFORM, 'f', - "Input format - default PEM (one of DER or PEM)"}, - {"in", OPT_IN, '<', "Input file - default stdin"}, - {"outform", OPT_OUTFORM, 'f', - "Output format - default PEM (one of DER or PEM)"}, - {"out", OPT_OUT, '>', "Output file - default stdout"}, - {"keyform", OPT_KEYFORM, 'E', "Private key format - default PEM"}, - {"passin", OPT_PASSIN, 's', "Private key password/pass-phrase source"}, - {"serial", OPT_SERIAL, '-', "Print serial number value"}, - {"subject_hash", OPT_HASH, '-', "Print subject hash value"}, - {"issuer_hash", OPT_ISSUER_HASH, '-', "Print issuer hash value"}, - {"hash", OPT_HASH, '-', "Synonym for -subject_hash"}, - {"subject", OPT_SUBJECT, '-', "Print subject DN"}, - {"issuer", OPT_ISSUER, '-', "Print issuer DN"}, - {"email", OPT_EMAIL, '-', "Print email address(es)"}, - {"startdate", OPT_STARTDATE, '-', "Set notBefore field"}, - {"enddate", OPT_ENDDATE, '-', "Set notAfter field"}, - {"purpose", OPT_PURPOSE, '-', "Print out certificate purposes"}, - {"dates", OPT_DATES, '-', "Both Before and After dates"}, - {"modulus", OPT_MODULUS, '-', "Print the RSA key modulus"}, - {"pubkey", OPT_PUBKEY, '-', "Output the public key"}, - {"fingerprint", OPT_FINGERPRINT, '-', - "Print the certificate fingerprint"}, - {"alias", OPT_ALIAS, '-', "Output certificate alias"}, - {"noout", OPT_NOOUT, '-', "No output, just status"}, - {"nocert", OPT_NOCERT, '-', "No certificate output"}, - {"ocspid", OPT_OCSPID, '-', - "Print OCSP hash values for the subject name and public key"}, - {"ocsp_uri", OPT_OCSP_URI, '-', "Print OCSP Responder URL(s)"}, - {"trustout", OPT_TRUSTOUT, '-', "Output a trusted certificate"}, - {"clrtrust", OPT_CLRTRUST, '-', "Clear all trusted purposes"}, - {"clrext", OPT_CLREXT, '-', "Clear all certificate extensions"}, - {"addtrust", OPT_ADDTRUST, 's', "Trust certificate for a given purpose"}, - {"addreject", OPT_ADDREJECT, 's', - "Reject certificate for a given purpose"}, - {"setalias", OPT_SETALIAS, 's', "Set certificate alias"}, - {"days", OPT_DAYS, 'n', - "How long till expiry of a signed certificate - def 30 days"}, - {"checkend", OPT_CHECKEND, 'M', - "Check whether the cert expires in the next arg seconds"}, - {OPT_MORE_STR, 1, 1, "Exit 1 if so, 0 if not"}, - {"signkey", OPT_SIGNKEY, 's', "Self sign cert with arg"}, - {"x509toreq", OPT_X509TOREQ, '-', - "Output a certification request object"}, - {"req", OPT_REQ, '-', "Input is a certificate request, sign and output"}, - {"CA", OPT_CA, '<', "Set the CA certificate, must be PEM format"}, - {"CAkey", OPT_CAKEY, 's', - "The CA key, must be PEM format; if not in CAfile"}, - {"CAcreateserial", OPT_CACREATESERIAL, '-', - "Create serial number file if it does not exist"}, - {"CAserial", OPT_CASERIAL, 's', "Serial file"}, - {"set_serial", OPT_SET_SERIAL, 's', "Serial number to use"}, - {"text", OPT_TEXT, '-', "Print the certificate in text form"}, - {"ext", OPT_EXT, 's', "Print various X509V3 extensions"}, - {"C", OPT_C, '-', "Print out C code forms"}, - {"extfile", OPT_EXTFILE, '<', "File with X509V3 extensions to add"}, - OPT_R_OPTIONS, - {"extensions", OPT_EXTENSIONS, 's', "Section from config file to use"}, - {"nameopt", OPT_NAMEOPT, 's', "Various certificate name options"}, - {"certopt", OPT_CERTOPT, 's', "Various certificate text options"}, - {"checkhost", OPT_CHECKHOST, 's', "Check certificate matches host"}, - {"checkemail", OPT_CHECKEMAIL, 's', "Check certificate matches email"}, - {"checkip", OPT_CHECKIP, 's', "Check certificate matches ipaddr"}, - {"CAform", OPT_CAFORM, 'F', "CA format - default PEM"}, - {"CAkeyform", OPT_CAKEYFORM, 'E', "CA key format - default PEM"}, - {"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"}, - {"force_pubkey", OPT_FORCE_PUBKEY, '<', "Force the Key to put inside certificate"}, - {"next_serial", OPT_NEXT_SERIAL, '-', "Increment current certificate serial number"}, - {"clrreject", OPT_CLRREJECT, '-', - "Clears all the prohibited or rejected uses of the certificate"}, - {"badsig", OPT_BADSIG, '-', "Corrupt last byte of certificate signature (for test)"}, - {"", OPT_MD, '-', "Any supported digest"}, -#ifndef OPENSSL_NO_MD5 - {"subject_hash_old", OPT_SUBJECT_HASH_OLD, '-', - "Print old-style (MD5) subject hash value"}, - {"issuer_hash_old", OPT_ISSUER_HASH_OLD, '-', - "Print old-style (MD5) issuer hash value"}, -#endif -#ifndef OPENSSL_NO_ENGINE - {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, -#endif - {"preserve_dates", OPT_PRESERVE_DATES, '-', "preserve existing dates when signing"}, - {NULL} -}; - -int x509_main(int argc, char **argv) -{ - ASN1_INTEGER *sno = NULL; - ASN1_OBJECT *objtmp = NULL; - BIO *out = NULL; - CONF *extconf = NULL; - EVP_PKEY *Upkey = NULL, *CApkey = NULL, *fkey = NULL; - STACK_OF(ASN1_OBJECT) *trust = NULL, *reject = NULL; - STACK_OF(OPENSSL_STRING) *sigopts = NULL; - X509 *x = NULL, *xca = NULL; - X509_REQ *req = NULL, *rq = NULL; - X509_STORE *ctx = NULL; - const EVP_MD *digest = NULL; - char *CAkeyfile = NULL, *CAserial = NULL, *fkeyfile = NULL, *alias = NULL; - char *checkhost = NULL, *checkemail = NULL, *checkip = NULL, *exts = NULL; - char *extsect = NULL, *extfile = NULL, *passin = NULL, *passinarg = NULL; - char *infile = NULL, *outfile = NULL, *keyfile = NULL, *CAfile = NULL; - char *prog; - int x509req = 0, days = DEF_DAYS, modulus = 0, pubkey = 0, pprint = 0; - int C = 0, CAformat = FORMAT_PEM, CAkeyformat = FORMAT_PEM; - int fingerprint = 0, reqfile = 0, checkend = 0; - int informat = FORMAT_PEM, outformat = FORMAT_PEM, keyformat = FORMAT_PEM; - int next_serial = 0, subject_hash = 0, issuer_hash = 0, ocspid = 0; - int noout = 0, sign_flag = 0, CA_flag = 0, CA_createserial = 0, email = 0; - int ocsp_uri = 0, trustout = 0, clrtrust = 0, clrreject = 0, aliasout = 0; - int ret = 1, i, num = 0, badsig = 0, clrext = 0, nocert = 0; - int text = 0, serial = 0, subject = 0, issuer = 0, startdate = 0, ext = 0; - int enddate = 0; - time_t checkoffset = 0; - unsigned long certflag = 0; - int preserve_dates = 0; - OPTION_CHOICE o; - ENGINE *e = NULL; -#ifndef OPENSSL_NO_MD5 - int subject_hash_old = 0, issuer_hash_old = 0; -#endif - - ctx = X509_STORE_new(); - if (ctx == NULL) - goto end; - X509_STORE_set_verify_cb(ctx, callb); - - prog = opt_init(argc, argv, x509_options); - while ((o = opt_next()) != OPT_EOF) { - switch (o) { - case OPT_EOF: - case OPT_ERR: - opthelp: - BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); - goto end; - case OPT_HELP: - opt_help(x509_options); - ret = 0; - goto end; - case OPT_INFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &informat)) - goto opthelp; - break; - case OPT_IN: - infile = opt_arg(); - break; - case OPT_OUTFORM: - if (!opt_format(opt_arg(), OPT_FMT_ANY, &outformat)) - goto opthelp; - break; - case OPT_KEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDE, &keyformat)) - goto opthelp; - break; - case OPT_CAFORM: - if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &CAformat)) - goto opthelp; - break; - case OPT_CAKEYFORM: - if (!opt_format(opt_arg(), OPT_FMT_PDE, &CAkeyformat)) - goto opthelp; - break; - case OPT_OUT: - outfile = opt_arg(); - break; - case OPT_REQ: - reqfile = 1; - break; - - case OPT_SIGOPT: - if (!sigopts) - sigopts = sk_OPENSSL_STRING_new_null(); - if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, opt_arg())) - goto opthelp; - break; - case OPT_DAYS: - if (preserve_dates) - goto opthelp; - days = atoi(opt_arg()); - break; - case OPT_PASSIN: - passinarg = opt_arg(); - break; - case OPT_EXTFILE: - extfile = opt_arg(); - break; - case OPT_R_CASES: - if (!opt_rand(o)) - goto end; - break; - case OPT_EXTENSIONS: - extsect = opt_arg(); - break; - case OPT_SIGNKEY: - keyfile = opt_arg(); - sign_flag = ++num; - break; - case OPT_CA: - CAfile = opt_arg(); - CA_flag = ++num; - break; - case OPT_CAKEY: - CAkeyfile = opt_arg(); - break; - case OPT_CASERIAL: - CAserial = opt_arg(); - break; - case OPT_SET_SERIAL: - if (sno != NULL) { - BIO_printf(bio_err, "Serial number supplied twice\n"); - goto opthelp; - } - if ((sno = s2i_ASN1_INTEGER(NULL, opt_arg())) == NULL) - goto opthelp; - break; - case OPT_FORCE_PUBKEY: - fkeyfile = opt_arg(); - break; - case OPT_ADDTRUST: - if ((objtmp = OBJ_txt2obj(opt_arg(), 0)) == NULL) { - BIO_printf(bio_err, - "%s: Invalid trust object value %s\n", - prog, opt_arg()); - goto opthelp; - } - if (trust == NULL && (trust = sk_ASN1_OBJECT_new_null()) == NULL) - goto end; - sk_ASN1_OBJECT_push(trust, objtmp); - objtmp = NULL; - trustout = 1; - break; - case OPT_ADDREJECT: - if ((objtmp = OBJ_txt2obj(opt_arg(), 0)) == NULL) { - BIO_printf(bio_err, - "%s: Invalid reject object value %s\n", - prog, opt_arg()); - goto opthelp; - } - if (reject == NULL - && (reject = sk_ASN1_OBJECT_new_null()) == NULL) - goto end; - sk_ASN1_OBJECT_push(reject, objtmp); - objtmp = NULL; - trustout = 1; - break; - case OPT_SETALIAS: - alias = opt_arg(); - trustout = 1; - break; - case OPT_CERTOPT: - if (!set_cert_ex(&certflag, opt_arg())) - goto opthelp; - break; - case OPT_NAMEOPT: - if (!set_nameopt(opt_arg())) - goto opthelp; - break; - case OPT_ENGINE: - e = setup_engine(opt_arg(), 0); - break; - case OPT_C: - C = ++num; - break; - case OPT_EMAIL: - email = ++num; - break; - case OPT_OCSP_URI: - ocsp_uri = ++num; - break; - case OPT_SERIAL: - serial = ++num; - break; - case OPT_NEXT_SERIAL: - next_serial = ++num; - break; - case OPT_MODULUS: - modulus = ++num; - break; - case OPT_PUBKEY: - pubkey = ++num; - break; - case OPT_X509TOREQ: - x509req = ++num; - break; - case OPT_TEXT: - text = ++num; - break; - case OPT_SUBJECT: - subject = ++num; - break; - case OPT_ISSUER: - issuer = ++num; - break; - case OPT_FINGERPRINT: - fingerprint = ++num; - break; - case OPT_HASH: - subject_hash = ++num; - break; - case OPT_ISSUER_HASH: - issuer_hash = ++num; - break; - case OPT_PURPOSE: - pprint = ++num; - break; - case OPT_STARTDATE: - startdate = ++num; - break; - case OPT_ENDDATE: - enddate = ++num; - break; - case OPT_NOOUT: - noout = ++num; - break; - case OPT_EXT: - ext = ++num; - exts = opt_arg(); - break; - case OPT_NOCERT: - nocert = 1; - break; - case OPT_TRUSTOUT: - trustout = 1; - break; - case OPT_CLRTRUST: - clrtrust = ++num; - break; - case OPT_CLRREJECT: - clrreject = ++num; - break; - case OPT_ALIAS: - aliasout = ++num; - break; - case OPT_CACREATESERIAL: - CA_createserial = ++num; - break; - case OPT_CLREXT: - clrext = 1; - break; - case OPT_OCSPID: - ocspid = ++num; - break; - case OPT_BADSIG: - badsig = 1; - break; -#ifndef OPENSSL_NO_MD5 - case OPT_SUBJECT_HASH_OLD: - subject_hash_old = ++num; - break; - case OPT_ISSUER_HASH_OLD: - issuer_hash_old = ++num; - break; -#else - case OPT_SUBJECT_HASH_OLD: - case OPT_ISSUER_HASH_OLD: - break; -#endif - case OPT_DATES: - startdate = ++num; - enddate = ++num; - break; - case OPT_CHECKEND: - checkend = 1; - { - intmax_t temp = 0; - if (!opt_imax(opt_arg(), &temp)) - goto opthelp; - checkoffset = (time_t)temp; - if ((intmax_t)checkoffset != temp) { - BIO_printf(bio_err, "%s: checkend time out of range %s\n", - prog, opt_arg()); - goto opthelp; - } - } - break; - case OPT_CHECKHOST: - checkhost = opt_arg(); - break; - case OPT_CHECKEMAIL: - checkemail = opt_arg(); - break; - case OPT_CHECKIP: - checkip = opt_arg(); - break; - case OPT_PRESERVE_DATES: - if (days != DEF_DAYS) - goto opthelp; - preserve_dates = 1; - break; - case OPT_MD: - if (!opt_md(opt_unknown(), &digest)) - goto opthelp; - } - } - argc = opt_num_rest(); - argv = opt_rest(); - if (argc != 0) { - BIO_printf(bio_err, "%s: Unknown parameter %s\n", prog, argv[0]); - goto opthelp; - } - - if (!app_passwd(passinarg, NULL, &passin, NULL)) { - BIO_printf(bio_err, "Error getting password\n"); - goto end; - } - - if (!X509_STORE_set_default_paths(ctx)) { - ERR_print_errors(bio_err); - goto end; - } - - if (fkeyfile != NULL) { - fkey = load_pubkey(fkeyfile, keyformat, 0, NULL, e, "Forced key"); - if (fkey == NULL) - goto end; - } - - if ((CAkeyfile == NULL) && (CA_flag) && (CAformat == FORMAT_PEM)) { - CAkeyfile = CAfile; - } else if ((CA_flag) && (CAkeyfile == NULL)) { - BIO_printf(bio_err, - "need to specify a CAkey if using the CA command\n"); - goto end; - } - - if (extfile != NULL) { - X509V3_CTX ctx2; - if ((extconf = app_load_config(extfile)) == NULL) - goto end; - if (extsect == NULL) { - extsect = NCONF_get_string(extconf, "default", "extensions"); - if (extsect == NULL) { - ERR_clear_error(); - extsect = "default"; - } - } - X509V3_set_ctx_test(&ctx2); - X509V3_set_nconf(&ctx2, extconf); - if (!X509V3_EXT_add_nconf(extconf, &ctx2, extsect, NULL)) { - BIO_printf(bio_err, - "Error Loading extension section %s\n", extsect); - ERR_print_errors(bio_err); - goto end; - } - } - - if (reqfile) { - EVP_PKEY *pkey; - BIO *in; - - if (!sign_flag && !CA_flag) { - BIO_printf(bio_err, "We need a private key to sign with\n"); - goto end; - } - in = bio_open_default(infile, 'r', informat); - if (in == NULL) - goto end; - req = PEM_read_bio_X509_REQ(in, NULL, NULL, NULL); - BIO_free(in); - - if (req == NULL) { - ERR_print_errors(bio_err); - goto end; - } - - if ((pkey = X509_REQ_get0_pubkey(req)) == NULL) { - BIO_printf(bio_err, "error unpacking public key\n"); - goto end; - } - i = X509_REQ_verify(req, pkey); - if (i < 0) { - BIO_printf(bio_err, "Signature verification error\n"); - ERR_print_errors(bio_err); - goto end; - } - if (i == 0) { - BIO_printf(bio_err, - "Signature did not match the certificate request\n"); - goto end; - } else { - BIO_printf(bio_err, "Signature ok\n"); - } - - print_name(bio_err, "subject=", X509_REQ_get_subject_name(req), - get_nameopt()); - - if ((x = X509_new()) == NULL) - goto end; - - if (sno == NULL) { - sno = ASN1_INTEGER_new(); - if (sno == NULL || !rand_serial(NULL, sno)) - goto end; - if (!X509_set_serialNumber(x, sno)) - goto end; - ASN1_INTEGER_free(sno); - sno = NULL; - } else if (!X509_set_serialNumber(x, sno)) { - goto end; - } - - if (!X509_set_issuer_name(x, X509_REQ_get_subject_name(req))) - goto end; - if (!X509_set_subject_name(x, X509_REQ_get_subject_name(req))) - goto end; - if (!set_cert_times(x, NULL, NULL, days)) - goto end; - - if (fkey != NULL) { - X509_set_pubkey(x, fkey); - } else { - pkey = X509_REQ_get0_pubkey(req); - X509_set_pubkey(x, pkey); - } - } else { - x = load_cert(infile, informat, "Certificate"); - } - - if (x == NULL) - goto end; - if (CA_flag) { - xca = load_cert(CAfile, CAformat, "CA Certificate"); - if (xca == NULL) - goto end; - } - - out = bio_open_default(outfile, 'w', outformat); - if (out == NULL) - goto end; - - if (!noout || text || next_serial) - OBJ_create("2.99999.3", "SET.ex3", "SET x509v3 extension 3"); - - if (alias) - X509_alias_set1(x, (unsigned char *)alias, -1); - - if (clrtrust) - X509_trust_clear(x); - if (clrreject) - X509_reject_clear(x); - - if (trust != NULL) { - for (i = 0; i < sk_ASN1_OBJECT_num(trust); i++) { - objtmp = sk_ASN1_OBJECT_value(trust, i); - X509_add1_trust_object(x, objtmp); - } - objtmp = NULL; - } - - if (reject != NULL) { - for (i = 0; i < sk_ASN1_OBJECT_num(reject); i++) { - objtmp = sk_ASN1_OBJECT_value(reject, i); - X509_add1_reject_object(x, objtmp); - } - objtmp = NULL; - } - - if (badsig) { - const ASN1_BIT_STRING *signature; - - X509_get0_signature(&signature, NULL, x); - corrupt_signature(signature); - } - - if (num) { - for (i = 1; i <= num; i++) { - if (issuer == i) { - print_name(out, "issuer=", X509_get_issuer_name(x), get_nameopt()); - } else if (subject == i) { - print_name(out, "subject=", - X509_get_subject_name(x), get_nameopt()); - } else if (serial == i) { - BIO_printf(out, "serial="); - i2a_ASN1_INTEGER(out, X509_get_serialNumber(x)); - BIO_printf(out, "\n"); - } else if (next_serial == i) { - ASN1_INTEGER *ser = X509_get_serialNumber(x); - BIGNUM *bnser = ASN1_INTEGER_to_BN(ser, NULL); - - if (!bnser) - goto end; - if (!BN_add_word(bnser, 1)) - goto end; - ser = BN_to_ASN1_INTEGER(bnser, NULL); - if (!ser) - goto end; - BN_free(bnser); - i2a_ASN1_INTEGER(out, ser); - ASN1_INTEGER_free(ser); - BIO_puts(out, "\n"); - } else if ((email == i) || (ocsp_uri == i)) { - int j; - STACK_OF(OPENSSL_STRING) *emlst; - if (email == i) - emlst = X509_get1_email(x); - else - emlst = X509_get1_ocsp(x); - for (j = 0; j < sk_OPENSSL_STRING_num(emlst); j++) - BIO_printf(out, "%s\n", - sk_OPENSSL_STRING_value(emlst, j)); - X509_email_free(emlst); - } else if (aliasout == i) { - unsigned char *alstr; - alstr = X509_alias_get0(x, NULL); - if (alstr) - BIO_printf(out, "%s\n", alstr); - else - BIO_puts(out, "<No Alias>\n"); - } else if (subject_hash == i) { - BIO_printf(out, "%08lx\n", X509_subject_name_hash(x)); - } -#ifndef OPENSSL_NO_MD5 - else if (subject_hash_old == i) { - BIO_printf(out, "%08lx\n", X509_subject_name_hash_old(x)); - } -#endif - else if (issuer_hash == i) { - BIO_printf(out, "%08lx\n", X509_issuer_name_hash(x)); - } -#ifndef OPENSSL_NO_MD5 - else if (issuer_hash_old == i) { - BIO_printf(out, "%08lx\n", X509_issuer_name_hash_old(x)); - } -#endif - else if (pprint == i) { - X509_PURPOSE *ptmp; - int j; - BIO_printf(out, "Certificate purposes:\n"); - for (j = 0; j < X509_PURPOSE_get_count(); j++) { - ptmp = X509_PURPOSE_get0(j); - purpose_print(out, x, ptmp); - } - } else if (modulus == i) { - EVP_PKEY *pkey; - - pkey = X509_get0_pubkey(x); - if (pkey == NULL) { - BIO_printf(bio_err, "Modulus=unavailable\n"); - ERR_print_errors(bio_err); - goto end; - } - BIO_printf(out, "Modulus="); -#ifndef OPENSSL_NO_RSA - if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) { - const BIGNUM *n; - RSA_get0_key(EVP_PKEY_get0_RSA(pkey), &n, NULL, NULL); - BN_print(out, n); - } else -#endif -#ifndef OPENSSL_NO_DSA - if (EVP_PKEY_id(pkey) == EVP_PKEY_DSA) { - const BIGNUM *dsapub = NULL; - DSA_get0_key(EVP_PKEY_get0_DSA(pkey), &dsapub, NULL); - BN_print(out, dsapub); - } else -#endif - { - BIO_printf(out, "Wrong Algorithm type"); - } - BIO_printf(out, "\n"); - } else if (pubkey == i) { - EVP_PKEY *pkey; - - pkey = X509_get0_pubkey(x); - if (pkey == NULL) { - BIO_printf(bio_err, "Error getting public key\n"); - ERR_print_errors(bio_err); - goto end; - } - PEM_write_bio_PUBKEY(out, pkey); - } else if (C == i) { - unsigned char *d; - char *m; - int len; - - print_name(out, "/*\n" - " * Subject: ", X509_get_subject_name(x), get_nameopt()); - print_name(out, " * Issuer: ", X509_get_issuer_name(x), get_nameopt()); - BIO_puts(out, " */\n"); - - len = i2d_X509(x, NULL); - m = app_malloc(len, "x509 name buffer"); - d = (unsigned char *)m; - len = i2d_X509_NAME(X509_get_subject_name(x), &d); - print_array(out, "the_subject_name", len, (unsigned char *)m); - d = (unsigned char *)m; - len = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &d); - print_array(out, "the_public_key", len, (unsigned char *)m); - d = (unsigned char *)m; - len = i2d_X509(x, &d); - print_array(out, "the_certificate", len, (unsigned char *)m); - OPENSSL_free(m); - } else if (text == i) { - X509_print_ex(out, x, get_nameopt(), certflag); - } else if (startdate == i) { - BIO_puts(out, "notBefore="); - ASN1_TIME_print(out, X509_get0_notBefore(x)); - BIO_puts(out, "\n"); - } else if (enddate == i) { - BIO_puts(out, "notAfter="); - ASN1_TIME_print(out, X509_get0_notAfter(x)); - BIO_puts(out, "\n"); - } else if (fingerprint == i) { - int j; - unsigned int n; - unsigned char md[EVP_MAX_MD_SIZE]; - const EVP_MD *fdig = digest; - - if (fdig == NULL) - fdig = EVP_sha1(); - - if (!X509_digest(x, fdig, md, &n)) { - BIO_printf(bio_err, "out of memory\n"); - goto end; - } - BIO_printf(out, "%s Fingerprint=", - OBJ_nid2sn(EVP_MD_type(fdig))); - for (j = 0; j < (int)n; j++) { - BIO_printf(out, "%02X%c", md[j], (j + 1 == (int)n) - ? '\n' : ':'); - } - } - - /* should be in the library */ - else if ((sign_flag == i) && (x509req == 0)) { - BIO_printf(bio_err, "Getting Private key\n"); - if (Upkey == NULL) { - Upkey = load_key(keyfile, keyformat, 0, - passin, e, "Private key"); - if (Upkey == NULL) - goto end; - } - - if (!sign(x, Upkey, days, clrext, digest, extconf, extsect, preserve_dates)) - goto end; - } else if (CA_flag == i) { - BIO_printf(bio_err, "Getting CA Private Key\n"); - if (CAkeyfile != NULL) { - CApkey = load_key(CAkeyfile, CAkeyformat, - 0, passin, e, "CA Private Key"); - if (CApkey == NULL) - goto end; - } - - if (!x509_certify(ctx, CAfile, digest, x, xca, - CApkey, sigopts, - CAserial, CA_createserial, days, clrext, - extconf, extsect, sno, reqfile, preserve_dates)) - goto end; - } else if (x509req == i) { - EVP_PKEY *pk; - - BIO_printf(bio_err, "Getting request Private Key\n"); - if (keyfile == NULL) { - BIO_printf(bio_err, "no request key file specified\n"); - goto end; - } else { - pk = load_key(keyfile, keyformat, 0, - passin, e, "request key"); - if (pk == NULL) - goto end; - } - - BIO_printf(bio_err, "Generating certificate request\n"); - - rq = X509_to_X509_REQ(x, pk, digest); - EVP_PKEY_free(pk); - if (rq == NULL) { - ERR_print_errors(bio_err); - goto end; - } - if (!noout) { - X509_REQ_print_ex(out, rq, get_nameopt(), X509_FLAG_COMPAT); - PEM_write_bio_X509_REQ(out, rq); - } - noout = 1; - } else if (ocspid == i) { - X509_ocspid_print(out, x); - } else if (ext == i) { - print_x509v3_exts(out, x, exts); - } - } - } - - if (checkend) { - time_t tcheck = time(NULL) + checkoffset; - - if (X509_cmp_time(X509_get0_notAfter(x), &tcheck) < 0) { - BIO_printf(out, "Certificate will expire\n"); - ret = 1; - } else { - BIO_printf(out, "Certificate will not expire\n"); - ret = 0; - } - goto end; - } - - print_cert_checks(out, x, checkhost, checkemail, checkip); - - if (noout || nocert) { - ret = 0; - goto end; - } - - if (outformat == FORMAT_ASN1) { - i = i2d_X509_bio(out, x); - } else if (outformat == FORMAT_PEM) { - if (trustout) - i = PEM_write_bio_X509_AUX(out, x); - else - i = PEM_write_bio_X509(out, x); - } else { - BIO_printf(bio_err, "bad output format specified for outfile\n"); - goto end; - } - if (!i) { - BIO_printf(bio_err, "unable to write certificate\n"); - ERR_print_errors(bio_err); - goto end; - } - ret = 0; - end: - NCONF_free(extconf); - BIO_free_all(out); - X509_STORE_free(ctx); - X509_REQ_free(req); - X509_free(x); - X509_free(xca); - EVP_PKEY_free(Upkey); - EVP_PKEY_free(CApkey); - EVP_PKEY_free(fkey); - sk_OPENSSL_STRING_free(sigopts); - X509_REQ_free(rq); - ASN1_INTEGER_free(sno); - sk_ASN1_OBJECT_pop_free(trust, ASN1_OBJECT_free); - sk_ASN1_OBJECT_pop_free(reject, ASN1_OBJECT_free); - ASN1_OBJECT_free(objtmp); - release_engine(e); - OPENSSL_free(passin); - return ret; -} - -static ASN1_INTEGER *x509_load_serial(const char *CAfile, - const char *serialfile, int create) -{ - char *buf = NULL; - ASN1_INTEGER *bs = NULL; - BIGNUM *serial = NULL; - - if (serialfile == NULL) { - const char *p = strrchr(CAfile, '.'); - size_t len = p != NULL ? (size_t)(p - CAfile) : strlen(CAfile); - - buf = app_malloc(len + sizeof(POSTFIX), "serial# buffer"); - memcpy(buf, CAfile, len); - memcpy(buf + len, POSTFIX, sizeof(POSTFIX)); - serialfile = buf; - } - - serial = load_serial(serialfile, create, NULL); - if (serial == NULL) - goto end; - - if (!BN_add_word(serial, 1)) { - BIO_printf(bio_err, "add_word failure\n"); - goto end; - } - - if (!save_serial(serialfile, NULL, serial, &bs)) - goto end; - - end: - OPENSSL_free(buf); - BN_free(serial); - return bs; -} - -static int x509_certify(X509_STORE *ctx, const char *CAfile, const EVP_MD *digest, - X509 *x, X509 *xca, EVP_PKEY *pkey, - STACK_OF(OPENSSL_STRING) *sigopts, - const char *serialfile, int create, - int days, int clrext, CONF *conf, const char *section, - ASN1_INTEGER *sno, int reqfile, int preserve_dates) -{ - int ret = 0; - ASN1_INTEGER *bs = NULL; - X509_STORE_CTX *xsc = NULL; - EVP_PKEY *upkey; - - upkey = X509_get0_pubkey(xca); - if (upkey == NULL) { - BIO_printf(bio_err, "Error obtaining CA X509 public key\n"); - goto end; - } - EVP_PKEY_copy_parameters(upkey, pkey); - - xsc = X509_STORE_CTX_new(); - if (xsc == NULL || !X509_STORE_CTX_init(xsc, ctx, x, NULL)) { - BIO_printf(bio_err, "Error initialising X509 store\n"); - goto end; - } - if (sno) - bs = sno; - else if ((bs = x509_load_serial(CAfile, serialfile, create)) == NULL) - goto end; - - /* - * NOTE: this certificate can/should be self signed, unless it was a - * certificate request in which case it is not. - */ - X509_STORE_CTX_set_cert(xsc, x); - X509_STORE_CTX_set_flags(xsc, X509_V_FLAG_CHECK_SS_SIGNATURE); - if (!reqfile && X509_verify_cert(xsc) <= 0) - goto end; - - if (!X509_check_private_key(xca, pkey)) { - BIO_printf(bio_err, - "CA certificate and CA private key do not match\n"); - goto end; - } - - if (!X509_set_issuer_name(x, X509_get_subject_name(xca))) - goto end; - if (!X509_set_serialNumber(x, bs)) - goto end; - - if (!preserve_dates && !set_cert_times(x, NULL, NULL, days)) - goto end; - - if (clrext) { - while (X509_get_ext_count(x) > 0) - X509_delete_ext(x, 0); - } - - if (conf != NULL) { - X509V3_CTX ctx2; - X509_set_version(x, 2); /* version 3 certificate */ - X509V3_set_ctx(&ctx2, xca, x, NULL, NULL, 0); - X509V3_set_nconf(&ctx2, conf); - if (!X509V3_EXT_add_nconf(conf, &ctx2, section, x)) - goto end; - } - - if (!do_X509_sign(x, pkey, digest, sigopts)) - goto end; - ret = 1; - end: - X509_STORE_CTX_free(xsc); - if (!ret) - ERR_print_errors(bio_err); - if (!sno) - ASN1_INTEGER_free(bs); - return ret; -} - -static int callb(int ok, X509_STORE_CTX *ctx) -{ - int err; - X509 *err_cert; - - /* - * it is ok to use a self signed certificate This case will catch both - * the initial ok == 0 and the final ok == 1 calls to this function - */ - err = X509_STORE_CTX_get_error(ctx); - if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) - return 1; - - /* - * BAD we should have gotten an error. Normally if everything worked - * X509_STORE_CTX_get_error(ctx) will still be set to - * DEPTH_ZERO_SELF_.... - */ - if (ok) { - BIO_printf(bio_err, - "error with certificate to be certified - should be self signed\n"); - return 0; - } else { - err_cert = X509_STORE_CTX_get_current_cert(ctx); - print_name(bio_err, NULL, X509_get_subject_name(err_cert), 0); - BIO_printf(bio_err, - "error with certificate - error %d at depth %d\n%s\n", err, - X509_STORE_CTX_get_error_depth(ctx), - X509_verify_cert_error_string(err)); - return 1; - } -} - -/* self sign */ -static int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, - const EVP_MD *digest, CONF *conf, const char *section, - int preserve_dates) -{ - - if (!X509_set_issuer_name(x, X509_get_subject_name(x))) - goto err; - if (!preserve_dates && !set_cert_times(x, NULL, NULL, days)) - goto err; - if (!X509_set_pubkey(x, pkey)) - goto err; - if (clrext) { - while (X509_get_ext_count(x) > 0) - X509_delete_ext(x, 0); - } - if (conf != NULL) { - X509V3_CTX ctx; - X509_set_version(x, 2); /* version 3 certificate */ - X509V3_set_ctx(&ctx, x, x, NULL, NULL, 0); - X509V3_set_nconf(&ctx, conf); - if (!X509V3_EXT_add_nconf(conf, &ctx, section, x)) - goto err; - } - if (!X509_sign(x, pkey, digest)) - goto err; - return 1; - err: - ERR_print_errors(bio_err); - return 0; -} - -static int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt) -{ - int id, i, idret; - const char *pname; - id = X509_PURPOSE_get_id(pt); - pname = X509_PURPOSE_get0_name(pt); - for (i = 0; i < 2; i++) { - idret = X509_check_purpose(cert, id, i); - BIO_printf(bio, "%s%s : ", pname, i ? " CA" : ""); - if (idret == 1) - BIO_printf(bio, "Yes\n"); - else if (idret == 0) - BIO_printf(bio, "No\n"); - else - BIO_printf(bio, "Yes (WARNING code=%d)\n", idret); - } - return 1; -} - -static int parse_ext_names(char *names, const char **result) -{ - char *p, *q; - int cnt = 0, len = 0; - - p = q = names; - len = strlen(names); - - while (q - names <= len) { - if (*q != ',' && *q != '\0') { - q++; - continue; - } - if (p != q) { - /* found */ - if (result != NULL) { - result[cnt] = p; - *q = '\0'; - } - cnt++; - } - p = ++q; - } - - return cnt; -} - -static int print_x509v3_exts(BIO *bio, X509 *x, const char *ext_names) -{ - const STACK_OF(X509_EXTENSION) *exts = NULL; - STACK_OF(X509_EXTENSION) *exts2 = NULL; - X509_EXTENSION *ext = NULL; - ASN1_OBJECT *obj; - int i, j, ret = 0, num, nn = 0; - const char *sn, **names = NULL; - char *tmp_ext_names = NULL; - - exts = X509_get0_extensions(x); - if ((num = sk_X509_EXTENSION_num(exts)) <= 0) { - BIO_printf(bio, "No extensions in certificate\n"); - ret = 1; - goto end; - } - - /* parse comma separated ext name string */ - if ((tmp_ext_names = OPENSSL_strdup(ext_names)) == NULL) - goto end; - if ((nn = parse_ext_names(tmp_ext_names, NULL)) == 0) { - BIO_printf(bio, "Invalid extension names: %s\n", ext_names); - goto end; - } - if ((names = OPENSSL_malloc(sizeof(char *) * nn)) == NULL) - goto end; - parse_ext_names(tmp_ext_names, names); - - for (i = 0; i < num; i++) { - ext = sk_X509_EXTENSION_value(exts, i); - - /* check if this ext is what we want */ - obj = X509_EXTENSION_get_object(ext); - sn = OBJ_nid2sn(OBJ_obj2nid(obj)); - if (sn == NULL || strcmp(sn, "UNDEF") == 0) - continue; - - for (j = 0; j < nn; j++) { - if (strcmp(sn, names[j]) == 0) { - /* push the extension into a new stack */ - if (exts2 == NULL - && (exts2 = sk_X509_EXTENSION_new_null()) == NULL) - goto end; - if (!sk_X509_EXTENSION_push(exts2, ext)) - goto end; - } - } - } - - if (!sk_X509_EXTENSION_num(exts2)) { - BIO_printf(bio, "No extensions matched with %s\n", ext_names); - ret = 1; - goto end; - } - - ret = X509V3_extensions_print(bio, NULL, exts2, 0, 0); - end: - sk_X509_EXTENSION_free(exts2); - OPENSSL_free(names); - OPENSSL_free(tmp_ext_names); - return ret; -} diff --git a/contrib/libs/openssl/apps/ya.make b/contrib/libs/openssl/apps/ya.make deleted file mode 100644 index e6b81c6b18..0000000000 --- a/contrib/libs/openssl/apps/ya.make +++ /dev/null @@ -1,171 +0,0 @@ -PROGRAM(openssl) - -OWNER( - somov - g:cpp-contrib -) - -LICENSE( - OpenSSL AND - Public-Domain -) - -LICENSE_TEXTS(.yandex_meta/licenses.list.txt) - -PEERDIR( - contrib/libs/openssl - contrib/libs/openssl/crypto -) - -ADDINCL( - contrib/libs/openssl - contrib/libs/openssl/apps - contrib/libs/openssl/include -) - -NO_COMPILER_WARNINGS() - -NO_RUNTIME() - -CFLAGS( - -DAESNI_ASM - -DECP_NISTZ256_ASM - -DKECCAK1600_ASM - -DOPENSSL_BN_ASM_MONT - -DOPENSSL_CPUID_OBJ - -DOPENSSL_PIC - -DPOLY1305_ASM - -DSHA1_ASM - -DSHA256_ASM - -DSHA512_ASM - -DVPAES_ASM - -DZLIB -) - -IF (OS_DARWIN AND ARCH_X86_64 OR OS_LINUX AND ARCH_AARCH64 OR OS_LINUX AND ARCH_X86_64) - CFLAGS( - -DENGINESDIR=\"/usr/local/lib/engines-1.1\" - -DOPENSSLDIR=\"/usr/local/ssl\" - ) -ENDIF() - -IF (OS_DARWIN AND ARCH_X86_64 OR OS_LINUX AND ARCH_X86_64 OR OS_WINDOWS AND ARCH_X86_64) - CFLAGS( - -DGHASH_ASM - -DL_ENDIAN - -DMD5_ASM - -DOPENSSL_BN_ASM_GF2m - -DOPENSSL_BN_ASM_MONT5 - -DOPENSSL_IA32_SSE2 - -DPADLOCK_ASM - -DRC4_ASM - -DX25519_ASM - ) -ENDIF() - -IF (OS_LINUX AND ARCH_AARCH64 OR OS_LINUX AND ARCH_X86_64) - CFLAGS( - -DOPENSSL_USE_NODELETE - ) -ENDIF() - -IF (OS_DARWIN AND ARCH_X86_64) - CFLAGS( - -D_REENTRANT - ) -ENDIF() - -IF (OS_DARWIN AND ARCH_ARM64) - CFLAGS( - -DL_ENDIAN - -DOPENSSL_PIC - -D_REENTRANT - ) -ENDIF() - -IF (OS_WINDOWS) - IF (ARCH_X86_64) - CFLAGS( - -DENGINESDIR="\"C:\\\\Program\ Files\\\\OpenSSL\\\\lib\\\\engines-1_1\"" - -DOPENSSLDIR="\"C:\\\\Program\ Files\\\\Common\ Files\\\\SSL\"" - ) - ELSEIF (ARCH_I386) - CFLAGS( - -DENGINESDIR="\"C:\\\\Program\ Files\ \(x86\)\\\\OpenSSL\\\\lib\\\\engines-1_1\"" - -DOPENSSLDIR="\"C:\\\\Program\ Files\ \(x86\)\\\\Common\ Files\\\\SSL\"" - ) - ENDIF() - CFLAGS( - -DOPENSSL_SYS_WIN32 - -DUNICODE - -DWIN32_LEAN_AND_MEAN - -D_CRT_SECURE_NO_DEPRECATE - -D_UNICODE - -D_WINSOCK_DEPRECATED_NO_WARNINGS - /GF - ) -ENDIF() - -SRCS( - app_rand.c - apps.c - asn1pars.c - bf_prefix.c - ca.c - ciphers.c - cms.c - crl.c - crl2p7.c - dgst.c - dhparam.c - dsa.c - dsaparam.c - ec.c - ecparam.c - enc.c - engine.c - errstr.c - gendsa.c - genpkey.c - genrsa.c - nseq.c - ocsp.c - openssl.c - opt.c - passwd.c - pkcs12.c - pkcs7.c - pkcs8.c - pkey.c - pkeyparam.c - pkeyutl.c - prime.c - rand.c - rehash.c - req.c - rsa.c - rsautl.c - s_cb.c - s_client.c - s_server.c - s_socket.c - s_time.c - sess_id.c - smime.c - speed.c - spkac.c - srp.c - storeutl.c - ts.c - verify.c - version.c - x509.c -) - -IF (OS_WINDOWS) - SRCS( - win32_init.c - ) -ENDIF() - -END() |