aboutsummaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2018-07-12 14:22:43 +0200
committerRichard Levitte <levitte@openssl.org>2018-10-01 15:33:28 +0200
commit8ddbff9c0811a0f11855eda871b9d3bff8fb325e (patch)
tree7b9e0cf12fb3215b6bcbd7013af2b952884bb90b /apps
parentef2dfc9902e015de91f015177bdf235c9000839e (diff)
downloadopenssl-8ddbff9c0811a0f11855eda871b9d3bff8fb325e.zip
openssl-8ddbff9c0811a0f11855eda871b9d3bff8fb325e.tar.gz
openssl-8ddbff9c0811a0f11855eda871b9d3bff8fb325e.tar.bz2
'openssl list': add option -objects to list built in objects
Related to #6696 Reviewed-by: Tim Hudson <tjh@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6702)
Diffstat (limited to 'apps')
-rw-r--r--apps/openssl.c58
1 files changed, 57 insertions, 1 deletions
diff --git a/apps/openssl.c b/apps/openssl.c
index a872e2c..3d6b276 100644
--- a/apps/openssl.c
+++ b/apps/openssl.c
@@ -316,6 +316,56 @@ static void list_missing_help(void)
}
}
+static void list_objects(void)
+{
+ int max_nid = OBJ_new_nid(0);
+ int i;
+ char *oid_buf = NULL;
+ int oid_size = 0;
+
+ /* Skip 0, since that's NID_undef */
+ for (i = 1; i < max_nid; i++) {
+ const ASN1_OBJECT *obj = OBJ_nid2obj(i);
+ const char *sn = OBJ_nid2sn(i);
+ const char *ln = OBJ_nid2ln(i);
+ int n = 0;
+
+ /*
+ * If one of the retrieved objects somehow generated an error,
+ * we ignore it. The check for NID_undef below will detect the
+ * error and simply skip to the next NID.
+ */
+ ERR_clear_error();
+
+ if (OBJ_obj2nid(obj) == NID_undef)
+ continue;
+
+ if ((n = OBJ_obj2txt(NULL, 0, obj, 1)) == 0) {
+ BIO_printf(bio_out, "# None-OID object: %s, %s\n", sn, ln);
+ continue;
+ }
+ if (n < 0)
+ break; /* Error */
+
+ if (n > oid_size) {
+ oid_buf = OPENSSL_realloc(oid_buf, n + 1);
+ if (oid_buf == NULL) {
+ BIO_printf(bio_err, "ERROR: Memory allocation\n");
+ break; /* Error */
+ }
+ oid_size = n + 1;
+ }
+ if (OBJ_obj2txt(oid_buf, oid_size, obj, 1) < 0)
+ break; /* Error */
+ if (ln == NULL || strcmp(sn, ln) == 0)
+ BIO_printf(bio_out, "%s = %s\n", sn, oid_buf);
+ else
+ BIO_printf(bio_out, "%s = %s, %s\n", sn, ln, oid_buf);
+ }
+
+ OPENSSL_free(oid_buf);
+}
+
static void list_options_for_command(const char *command)
{
const FUNCTION *fp;
@@ -348,7 +398,8 @@ 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
+ OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_DISABLED, OPT_MISSING_HELP,
+ OPT_OBJECTS
} HELPLIST_CHOICE;
const OPTIONS list_options[] = {
@@ -372,6 +423,8 @@ const OPTIONS list_options[] = {
"List missing detailed help strings"},
{"options", OPT_OPTIONS, 's',
"List options for specified command"},
+ {"objects", OPT_OBJECTS, '-',
+ "List built in objects (OID<->name mappings)"},
{NULL}
};
@@ -422,6 +475,9 @@ opthelp:
case OPT_MISSING_HELP:
list_missing_help();
break;
+ case OPT_OBJECTS:
+ list_objects();
+ break;
case OPT_OPTIONS:
list_options_for_command(opt_arg());
break;