Hash function for plugin features added.
authorTobias Brunner <tobias@strongswan.org>
Wed, 23 May 2012 15:37:53 +0000 (17:37 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 23 May 2012 15:50:05 +0000 (17:50 +0200)
src/libstrongswan/plugins/plugin_feature.c
src/libstrongswan/plugins/plugin_feature.h

index 7239e51..eed3a31 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright (C) 2012 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
  * Copyright (C) 2011 Martin Willi
  * Copyright (C) 2011 revosec AG
  *
@@ -51,6 +54,56 @@ ENUM(plugin_feature_names, FEATURE_NONE, FEATURE_CUSTOM,
 /**
  * See header.
  */
+u_int32_t plugin_feature_hash(plugin_feature_t *feature)
+{
+       chunk_t data;
+
+       switch (feature->type)
+       {
+               case FEATURE_NONE:
+               case FEATURE_RNG:
+               case FEATURE_NONCE_GEN:
+               case FEATURE_DATABASE:
+               case FEATURE_FETCHER:
+                       /* put these special cases in their (type-specific) buckets */
+                       data = chunk_empty;
+                       break;
+               case FEATURE_CRYPTER:
+               case FEATURE_AEAD:
+               case FEATURE_SIGNER:
+               case FEATURE_HASHER:
+               case FEATURE_PRF:
+               case FEATURE_DH:
+               case FEATURE_PRIVKEY:
+               case FEATURE_PRIVKEY_GEN:
+               case FEATURE_PUBKEY:
+               case FEATURE_PRIVKEY_SIGN:
+               case FEATURE_PUBKEY_VERIFY:
+               case FEATURE_PRIVKEY_DECRYPT:
+               case FEATURE_PUBKEY_ENCRYPT:
+               case FEATURE_CERT_DECODE:
+               case FEATURE_CERT_ENCODE:
+               case FEATURE_EAP_SERVER:
+               case FEATURE_EAP_PEER:
+                       data = chunk_from_thing(feature->arg);
+                       break;
+               case FEATURE_CUSTOM:
+                       data = chunk_create(feature->arg.custom,
+                                                               strlen(feature->arg.custom));
+                       break;
+               case FEATURE_XAUTH_SERVER:
+               case FEATURE_XAUTH_PEER:
+                       data = chunk_create(feature->arg.xauth,
+                                                               strlen(feature->arg.xauth));
+                       break;
+       }
+       return chunk_hash_inc(chunk_from_thing(feature->type),
+                                                 chunk_hash(data));
+}
+
+/**
+ * See header.
+ */
 bool plugin_feature_matches(plugin_feature_t *a, plugin_feature_t *b)
 {
        if (a->type == b->type)
index 25a58a4..10a316e 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright (C) 2012 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
  * Copyright (C) 2011 Martin Willi
  * Copyright (C) 2011 revosec AG
  *
@@ -304,6 +307,18 @@ struct plugin_feature_t {
 extern enum_name_t *plugin_feature_names;
 
 /**
+ * Calculates a hash value for the given feature.
+ *
+ * Since this is intended to be used with the plugin_features_matches function
+ * the hash is not really unique for all types of features (e.g. RNGs are all
+ * mapped to the same value because they are loosely matched by said function).
+ *
+ * @param feature      feature to hash
+ * @return                     hash value of the feature
+ */
+u_int32_t plugin_feature_hash(plugin_feature_t *feature);
+
+/**
  * Check if feature a matches to feature b.
  *
  * @param a                    feature to check