summaryrefslogtreecommitdiff
path: root/deps/openssl/openssl/apps/engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/openssl/openssl/apps/engine.c')
-rw-r--r--deps/openssl/openssl/apps/engine.c99
1 files changed, 71 insertions, 28 deletions
diff --git a/deps/openssl/openssl/apps/engine.c b/deps/openssl/openssl/apps/engine.c
index 4eeb642495..83f9588a0a 100644
--- a/deps/openssl/openssl/apps/engine.c
+++ b/deps/openssl/openssl/apps/engine.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.
+ * 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
@@ -13,12 +13,14 @@ NON_EMPTY_TRANSLATION_UNIT
#else
# 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,
@@ -26,7 +28,7 @@ typedef enum OPTION_choice {
OPT_V = 100, OPT_VV, OPT_VVV, OPT_VVVV
} OPTION_CHOICE;
-OPTIONS engine_options[] = {
+const OPTIONS engine_options[] = {
{OPT_HELP_STR, 1, '-', "Usage: %s [options] engine...\n"},
{OPT_HELP_STR, 1, '-',
" engine... Engines to load\n"},
@@ -47,28 +49,38 @@ OPTIONS engine_options[] = {
static int append_buf(char **buf, int *size, const char *s)
{
- if (*buf == NULL) {
- *size = 256;
- *buf = app_malloc(*size, "engine buffer");
- **buf = '\0';
- }
+ 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 (strlen(*buf) + strlen(s) >= (unsigned int)*size) {
- char *tmp;
- *size += 256;
- tmp = OPENSSL_realloc(*buf, *size);
- if (tmp == NULL) {
- OPENSSL_free(*buf);
- *buf = NULL;
- return 0;
+ 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;
}
- *buf = tmp;
- }
- if (**buf != '\0')
- OPENSSL_strlcat(*buf, ", ", *size);
- OPENSSL_strlcat(*buf, s, *size);
+ if (blen > 0) {
+ p += blen;
+ *p++ = ',';
+ *p++ = ' ';
+ }
+ }
+ strcpy(p, s);
return 1;
}
@@ -147,7 +159,7 @@ static int util_verbose(ENGINE *e, int verbose, BIO *out, const char *indent)
}
cmds = sk_OPENSSL_STRING_new_null();
- if (!cmds)
+ if (cmds == NULL)
goto err;
do {
@@ -249,15 +261,34 @@ static void util_do_cmds(ENGINE *e, STACK_OF(OPENSSL_STRING) *cmds,
if (!ENGINE_ctrl_cmd_string(e, buf, arg, 0))
res = 0;
}
- if (res)
+ if (res) {
BIO_printf(out, "[Success]: %s\n", cmd);
- else {
+ } 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;
@@ -380,7 +411,7 @@ int engine_main(int argc, char **argv)
goto end;
fn_c = ENGINE_get_ciphers(e);
- if (!fn_c)
+ if (fn_c == NULL)
goto skip_ciphers;
n = fn_c(e, NULL, &nids, 0);
for (k = 0; k < n; ++k)
@@ -389,7 +420,7 @@ int engine_main(int argc, char **argv)
skip_ciphers:
fn_d = ENGINE_get_digests(e);
- if (!fn_d)
+ if (fn_d == NULL)
goto skip_digests;
n = fn_d(e, NULL, &nids, 0);
for (k = 0; k < n; ++k)
@@ -398,14 +429,26 @@ int engine_main(int argc, char **argv)
skip_digests:
fn_pk = ENGINE_get_pkey_meths(e);
- if (!fn_pk)
+ 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:
- if (cap_buf && (*cap_buf != '\0'))
+ {
+ 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);
@@ -441,6 +484,6 @@ int engine_main(int argc, char **argv)
sk_OPENSSL_STRING_free(pre_cmds);
sk_OPENSSL_STRING_free(post_cmds);
BIO_free_all(out);
- return (ret);
+ return ret;
}
#endif