added the IMV_ATTESTATION_STATE_NONCE_REQ state
[strongswan.git] / src / libimcv / imcv.c
index 2fec1ec..a8c0af4 100644 (file)
  */
 
 #include "imcv.h"
+#include "ietf/ietf_attr.h"
+#include "ita/ita_attr.h"
 
-#include "utils.h"
+#include <utils.h>
 #include <debug.h>
+#include <pen/pen.h>
 
 #include <syslog.h>
 
 #define IMCV_DEBUG_LEVEL       1
 
 /**
- * Reference count for IMC/IMV instances
+ * PA-TNC attribute manager
  */
-refcount_t ref = 0;
+pa_tnc_attr_manager_t *imcv_pa_tnc_attributes;
+
+/**
+ * Reference count for libimcv
+ */
+static refcount_t libimcv_ref = 0;
+
+/**
+ * Reference count for libstrongswan
+ */
+static refcount_t libstrongswan_ref = 0;
 
 /**
  * Global configuration of imcv dbg function
@@ -47,6 +60,7 @@ static void imcv_dbg(debug_t group, level_t level, char *fmt, ...)
                if (!imcv_stderr_quiet)
                {
                        va_start(args, fmt);
+                       fprintf(stderr, "[HSR] ");
                        vfprintf(stderr, fmt, args);
                        fprintf(stderr, "\n");
                        va_end(args);
@@ -65,7 +79,7 @@ static void imcv_dbg(debug_t group, level_t level, char *fmt, ...)
                        {
                                *(next++) = '\0';
                        }
-                       syslog(priority, "%s\n", current);
+                       syslog(priority, "[HSR] %s\n", current);
                        current = next;
                }
        }
@@ -80,9 +94,9 @@ bool libimcv_init(void)
        if (lib)
        {
                /* did main program initialize libstrongswan? */
-               if (ref == 0)
+               if (libstrongswan_ref == 0)
                {
-                       ref_get(&ref);
+                       ref_get(&libstrongswan_ref);
                }
        }
        else
@@ -93,7 +107,8 @@ bool libimcv_init(void)
                        return FALSE;
                }
 
-               if (!lib->plugins->load(lib->plugins, NULL, "random"))
+               if (!lib->plugins->load(lib->plugins, NULL,
+                                                       "sha1 sha2 random gmp pubkey x509"))
                {
                        library_deinit();
                        return FALSE;
@@ -103,15 +118,25 @@ bool libimcv_init(void)
                imcv_debug_level =  lib->settings->get_int(lib->settings,
                                                                        "libimcv.debug_level", IMCV_DEBUG_LEVEL);
                imcv_stderr_quiet = lib->settings->get_int(lib->settings,
-                                                                       "libimcv.debug_level", FALSE);
+                                                                       "libimcv.stderr_quiet", FALSE);
                
                /* activate the imcv debugging hook */
                dbg = imcv_dbg;
                openlog("imcv", 0, LOG_DAEMON);
+       }
+       ref_get(&libstrongswan_ref);
 
+       if (libimcv_ref == 0)
+       {
+               /* initialize the PA-TNC attribute manager */
+               imcv_pa_tnc_attributes = pa_tnc_attr_manager_create();
+               imcv_pa_tnc_attributes->add_vendor(imcv_pa_tnc_attributes, PEN_IETF,
+                                                       ietf_attr_create_from_data, ietf_attr_names);
+               imcv_pa_tnc_attributes->add_vendor(imcv_pa_tnc_attributes, PEN_ITA,
+                                                       ita_attr_create_from_data, ita_attr_names);
                DBG1(DBG_LIB, "libimcv initialized");
        }
-       ref_get(&ref);
+       ref_get(&libimcv_ref);
 
        return TRUE;
 }
@@ -121,11 +146,16 @@ bool libimcv_init(void)
  */
 void libimcv_deinit(void)
 {
-       if (ref_put(&ref))
+       if (ref_put(&libimcv_ref))
        {
+               imcv_pa_tnc_attributes->remove_vendor(imcv_pa_tnc_attributes, PEN_IETF);
+               imcv_pa_tnc_attributes->remove_vendor(imcv_pa_tnc_attributes, PEN_ITA);
+               DESTROY_IF(imcv_pa_tnc_attributes);
                DBG1(DBG_LIB, "libimcv terminated");
+       }
+       if (ref_put(&libstrongswan_ref))
+       {
                library_deinit();               
        }
 }
 
-