DECODER & ENCODER: Add better tracing
authorRichard Levitte <levitte@openssl.org>
Wed, 9 Jun 2021 08:58:33 +0000 (10:58 +0200)
committerRichard Levitte <levitte@openssl.org>
Tue, 15 Jun 2021 14:21:32 +0000 (16:21 +0200)
Now that we have functions to get the name and properties of the
diverse implementations, we can as well display them for clarity.

Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15604)

crypto/encode_decode/decoder_pkey.c

index cdd9841ea9124712862f1837ddcfcc8436ab8a8e..cb66ee4617cf7e7d1dcb1c97173040f65a34832c 100644 (file)
@@ -219,6 +219,7 @@ struct collect_decoder_data_st {
     STACK_OF(OPENSSL_CSTRING) *names;
     OSSL_DECODER_CTX *ctx;
 
+    int total;
     unsigned int error_occurred:1;
 };
 
@@ -247,6 +248,15 @@ static void collect_decoder(OSSL_DECODER *decoder, void *arg)
             && !decoder->does_selection(provctx, data->ctx->selection))
         return;
 
+    OSSL_TRACE_BEGIN(DECODER) {
+        BIO_printf(trc_out,
+                   "(ctx %p) Checking out decoder %p:\n"
+                   "    %s with %s\n",
+                   (void *)data->ctx, (void *)decoder,
+                   OSSL_DECODER_get0_name(decoder),
+                   OSSL_DECODER_get0_properties(decoder));
+    } OSSL_TRACE_END(DECODER);
+
     end_i = sk_OPENSSL_CSTRING_num(data->names);
     for (i = 0; i < end_i; i++) {
         const char *name = sk_OPENSSL_CSTRING_value(data->names, i);
@@ -288,6 +298,7 @@ static void collect_decoder(OSSL_DECODER *decoder, void *arg)
                 data->error_occurred = 1;
                 return;
             }
+            data->total++;
 
             /* Success */
             return;
@@ -306,6 +317,8 @@ int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
     struct decoder_pkey_data_st *process_data = NULL;
     STACK_OF(EVP_KEYMGMT) *keymgmts = NULL;
     STACK_OF(OPENSSL_CSTRING) *names = NULL;
+    const char *input_type = ctx->start_input_type;
+    const char *input_structure = ctx->input_structure;
     int ok = 0;
     int isecoid = 0;
 
@@ -314,6 +327,18 @@ int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
                 || strcmp(keytype, "1.2.840.10045.2.1") == 0))
         isecoid = 1;
 
+    OSSL_TRACE_BEGIN(DECODER) {
+        BIO_printf(trc_out,
+                   "(ctx %p) Looking for decoders producing %s%s%s%s%s%s\n",
+                   (void *)ctx,
+                   keytype != NULL ? keytype : "",
+                   keytype != NULL ? " keys" : "keys of any type",
+                   input_type != NULL ? " from " : "",
+                   input_type != NULL ? input_type : "",
+                   input_structure != NULL ? " with " : "",
+                   input_structure != NULL ? input_structure : "");
+    } OSSL_TRACE_END(DECODER);
+
     if ((process_data = OPENSSL_zalloc(sizeof(*process_data))) == NULL
         || (propquery != NULL
             && (process_data->propq = OPENSSL_strdup(propquery)) == NULL)
@@ -354,6 +379,19 @@ int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
     sk_EVP_KEYMGMT_free(keymgmts);
     keymgmts = NULL;
 
+    OSSL_TRACE_BEGIN(DECODER) {
+        int i, end = sk_OPENSSL_CSTRING_num(names);
+
+        BIO_printf(trc_out,
+                   "    Found %d keytypes (possibly with duplicates)",
+                   end);
+        for (i = 0; i < end; i++)
+            BIO_printf(trc_out, "%s%s",
+                       i == 0 ? ": " : ", ",
+                       sk_OPENSSL_CSTRING_value(names, i));
+        BIO_printf(trc_out, "\n");
+    } OSSL_TRACE_END(DECODER);
+
     /*
      * Finally, find all decoders that have any keymgmt of the collected
      * keymgmt names
@@ -370,6 +408,12 @@ int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
 
         if (collect_decoder_data.error_occurred)
             goto err;
+
+        OSSL_TRACE_BEGIN(DECODER) {
+            BIO_printf(trc_out,
+                       "(ctx %p) Got %d decoders producing keys\n",
+                       (void *)ctx, collect_decoder_data.total);
+        } OSSL_TRACE_END(DECODER);
     }
 
     if (OSSL_DECODER_CTX_get_num_decoders(ctx) != 0) {