#include <openssl/safestack.h>
#include <openssl/kdf.h>
#include <openssl/serializer.h>
+#include <openssl/deserializer.h>
#include <openssl/core_names.h>
#include "apps.h"
#include "app_params.h"
sk_OSSL_SERIALIZER_pop_free(serializers, OSSL_SERIALIZER_free);
}
+/*
+ * Deserializers
+ */
+DEFINE_STACK_OF(OSSL_DESERIALIZER)
+static int deserializer_cmp(const OSSL_DESERIALIZER * const *a,
+ const OSSL_DESERIALIZER * const *b)
+{
+ int ret = OSSL_DESERIALIZER_number(*a) - OSSL_DESERIALIZER_number(*b);
+
+ if (ret == 0)
+ ret = strcmp(OSSL_PROVIDER_name(OSSL_DESERIALIZER_provider(*a)),
+ OSSL_PROVIDER_name(OSSL_DESERIALIZER_provider(*b)));
+ return ret;
+}
+
+static void collect_deserializers(OSSL_DESERIALIZER *deserializer, void *stack)
+{
+ STACK_OF(OSSL_DESERIALIZER) *deserializer_stack = stack;
+
+ sk_OSSL_DESERIALIZER_push(deserializer_stack, deserializer);
+ OSSL_DESERIALIZER_up_ref(deserializer);
+}
+
+static void list_deserializers(void)
+{
+ STACK_OF(OSSL_DESERIALIZER) *deserializers;
+ int i;
+
+ deserializers = sk_OSSL_DESERIALIZER_new(deserializer_cmp);
+ if (deserializers == NULL) {
+ BIO_printf(bio_err, "ERROR: Memory allocation\n");
+ return;
+ }
+ BIO_printf(bio_out, "Provided DESERIALIZERs:\n");
+ OSSL_DESERIALIZER_do_all_provided(NULL, collect_deserializers,
+ deserializers);
+ sk_OSSL_DESERIALIZER_sort(deserializers);
+
+ for (i = 0; i < sk_OSSL_DESERIALIZER_num(deserializers); i++) {
+ OSSL_DESERIALIZER *k = sk_OSSL_DESERIALIZER_value(deserializers, i);
+ STACK_OF(OPENSSL_CSTRING) *names =
+ sk_OPENSSL_CSTRING_new(name_cmp);
+
+ OSSL_DESERIALIZER_names_do_all(k, collect_names, names);
+
+ BIO_printf(bio_out, " ");
+ print_names(bio_out, names);
+ BIO_printf(bio_out, " @ %s (%s)\n",
+ OSSL_PROVIDER_name(OSSL_DESERIALIZER_provider(k)),
+ OSSL_DESERIALIZER_properties(k));
+
+ sk_OPENSSL_CSTRING_free(names);
+
+ if (verbose) {
+ print_param_types("settable operation parameters",
+ OSSL_DESERIALIZER_settable_ctx_params(k), 4);
+ }
+ }
+ sk_OSSL_DESERIALIZER_pop_free(deserializers, OSSL_DESERIALIZER_free);
+}
+
static void list_missing_help(void)
{
const FUNCTION *fp;
OPT_DIGEST_ALGORITHMS, OPT_CIPHER_COMMANDS, OPT_CIPHER_ALGORITHMS,
OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_DISABLED,
OPT_KDF_ALGORITHMS, OPT_RANDOM_GENERATORS, OPT_SERIALIZERS,
+ OPT_DESERIALIZERS,
OPT_MISSING_HELP, OPT_OBJECTS,
#ifndef OPENSSL_NO_DEPRECATED_3_0
OPT_ENGINES,
{"cipher-algorithms", OPT_CIPHER_ALGORITHMS, '-',
"List of cipher algorithms"},
{"serializers", OPT_SERIALIZERS, '-', "List of serialization methods" },
+ {"deserializers", OPT_DESERIALIZERS, '-',
+ "List of deserialization methods" },
{"public-key-algorithms", OPT_PK_ALGORITHMS, '-',
"List of public key algorithms"},
#ifndef OPENSSL_NO_DEPRECATED_3_0
unsigned int cipher_commands:1;
unsigned int cipher_algorithms:1;
unsigned int serializer_algorithms:1;
+ unsigned int deserializer_algorithms:1;
unsigned int pk_algorithms:1;
unsigned int pk_method:1;
#ifndef OPENSSL_NO_DEPRECATED_3_0
case OPT_SERIALIZERS:
todo.serializer_algorithms = 1;
break;
+ case OPT_DESERIALIZERS:
+ todo.deserializer_algorithms = 1;
+ break;
case OPT_PK_ALGORITHMS:
todo.pk_algorithms = 1;
break;
list_ciphers();
if (todo.serializer_algorithms)
list_serializers();
+ if (todo.deserializer_algorithms)
+ list_deserializers();
if (todo.pk_algorithms)
list_pkey();
#ifndef OPENSSL_NO_DEPRECATED_3_0
static const OSSL_ALGORITHM deflt_serializer[] = {
#define SER(name, fips, format, type, func_table) \
{ name, \
- "provider=default,fips=" fips ",format=" format ",type=" type, \
+ "provider=default,fips=" fips ",format=" format ",type=" type, \
(func_table) }
#include "serializers.inc"
#undef SER
static const OSSL_ALGORITHM deflt_deserializer[] = {
- { "RSA", "provider=default,fips=yes,input=der",
- der_to_rsa_deserializer_functions },
- { "RSA-PSS", "provider=default,fips=yes,input=der",
- der_to_rsapss_deserializer_functions },
-
- { "DER", "provider=default,fips=yes,input=pem",
- pem_to_der_deserializer_functions },
+#define DESER(name, fips, input, func_table) \
+ { name, \
+ "provider=default,fips=" fips ",input=" input, \
+ (func_table) }
+#include "deserializers.inc"
{ NULL, NULL, NULL }
};
+#undef DESER
static const OSSL_ALGORITHM *deflt_query(void *provctx, int operation_id,
int *no_cache)