Print this page
6414175 kcf.conf's supportedlist not providing much usefulness

@@ -17,16 +17,14 @@
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident   "%Z%%M% %I%     %E% SMI"
-
 /*
  * This file is part of the core Kernel Cryptographic Framework.
  * It implements the management of tables of Providers. Entries to
  * added and removed when cryptographic providers register with
  * and unregister from the framework, respectively. The KCF scheduler

@@ -52,23 +50,37 @@
 #include <sys/crypto/sched_impl.h>
 #include <sys/crypto/spi.h>
 
 #define KCF_MAX_PROVIDERS       512     /* max number of providers */
 
-static kmutex_t prov_tab_mutex; /* ensure exclusive access to the table */
+/*
+ * Prov_tab is an array of providers which is updated when
+ * a crypto provider registers with kcf. The provider calls the
+ * SPI routine, crypto_register_provider(), which in turn calls
+ * kcf_prov_tab_add_provider().
+ *
+ * A provider unregisters by calling crypto_unregister_provider()
+ * which triggers the removal of the prov_tab entry.
+ * It also calls kcf_remove_mech_provider().
+ *
+ * prov_tab entries are not updated from kcf.conf or by cryptoadm(1M).
+ */
 static kcf_provider_desc_t **prov_tab = NULL;
+static kmutex_t prov_tab_mutex; /* ensure exclusive access to the table */
 static uint_t prov_tab_num = 0; /* number of providers in table */
 static uint_t prov_tab_max = KCF_MAX_PROVIDERS;
 
 #if DEBUG
 extern int kcf_frmwrk_debug;
-static void kcf_prov_tab_dump(void);
+static void kcf_prov_tab_dump(char *message);
 #endif /* DEBUG */
 
+
 /*
- * Initialize the providers table. The providers table is dynamically
- * allocated with prov_tab_max entries.
+ * Initialize a mutex and the KCF providers table, prov_tab.
+ * The providers table is dynamically allocated with prov_tab_max entries.
+ * Called from kcf module _init().
  */
 void
 kcf_prov_tab_init(void)
 {
         mutex_init(&prov_tab_mutex, NULL, MUTEX_DRIVER, NULL);

@@ -122,11 +134,11 @@
         prov_desc->pd_kcf_prov_handle =
             (crypto_kcf_provider_handle_t)prov_desc->pd_prov_id;
 
 #if DEBUG
         if (kcf_frmwrk_debug >= 1)
-                kcf_prov_tab_dump();
+                kcf_prov_tab_dump("kcf_prov_tab_add_provider");
 #endif /* DEBUG */
 
         return (CRYPTO_SUCCESS);
 }
 

@@ -168,11 +180,11 @@
         KCF_PROV_REFRELE(prov_desc);
         KCF_PROV_IREFRELE(prov_desc);
 
 #if DEBUG
         if (kcf_frmwrk_debug >= 1)
-                kcf_prov_tab_dump();
+                kcf_prov_tab_dump("kcf_prov_tab_rem_provider");
 #endif /* DEBUG */
 
         return (CRYPTO_SUCCESS);
 }
 

@@ -815,27 +827,40 @@
 
         return (CRYPTO_SUCCESS);
 }
 
 #if DEBUG
-
+/*
+ * Dump the Kernel crypto providers table, prov_tab.
+ * If kcf_frmwrk_debug is >=2, also dump the mechanism lists.
+ */
 static void
-kcf_prov_tab_dump(void)
+kcf_prov_tab_dump(char *message)
 {
-        uint_t i;
+        uint_t i, j;
 
         mutex_enter(&prov_tab_mutex);
+        printf("Providers table prov_tab at %s:\n",
+            message != NULL ? message : "");
 
-        printf("Providers table:\n");
         for (i = 0; i < KCF_MAX_PROVIDERS; i++) {
-                if (prov_tab[i] != NULL) {
-                        printf("[%d]: (%s) %s\n",
-                            i, (prov_tab[i]->pd_prov_type ==
-                            CRYPTO_HW_PROVIDER) ? "HW" : "SW",
-                            prov_tab[i]->pd_description);
+                kcf_provider_desc_t *p = prov_tab[i];
+                if (p != NULL) {
+                        printf("[%d]: (%s) %d mechanisms, %s\n", i,
+                            (p->pd_prov_type == CRYPTO_HW_PROVIDER) ?
+                            "HW" : "SW",
+                            p->pd_mech_list_count, p->pd_description);
+                        if (kcf_frmwrk_debug >= 2) {
+                                printf("\tpd_mechanisms: ");
+                                for (j = 0; j < p->pd_mech_list_count; ++j) {
+                                        printf("%s \n",
+                                            p->pd_mechanisms[j].cm_mech_name);
                 }
+                                printf("\n");
         }
+                }
+        }
         printf("(end of providers table)\n");
 
         mutex_exit(&prov_tab_mutex);
 }