aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2014-06-20 09:07:05 +0200
committerTobias Brunner <tobias@strongswan.org>2014-06-20 16:21:55 +0200
commit94dbbd8079fd3d474c27ca7feaa372caf8bb33a1 (patch)
tree9fda35df26aa4f98bf954264d9da085762a28939
parente145f27db7a2917b498bb05f6991e8ba53b521ae (diff)
downloadstrongswan-94dbbd8079fd3d474c27ca7feaa372caf8bb33a1.tar.bz2
strongswan-94dbbd8079fd3d474c27ca7feaa372caf8bb33a1.tar.xz
crypto-factory: Only sort RNGs by algorithm identifier
Others remain in the order in which they were added, grouped by algorithm identifier and sorted by benchmarking speed, if provided.
-rw-r--r--src/libstrongswan/crypto/crypto_factory.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/libstrongswan/crypto/crypto_factory.c b/src/libstrongswan/crypto/crypto_factory.c
index 6dea30ee3..96fbc0d87 100644
--- a/src/libstrongswan/crypto/crypto_factory.c
+++ b/src/libstrongswan/crypto/crypto_factory.c
@@ -392,10 +392,10 @@ METHOD(crypto_factory_t, create_dh, diffie_hellman_t*,
/**
* Insert an algorithm entry to a list
*
- * Entries are sorted by algorithm identifier (which is important for RNGs)
- * while maintaining the order in which algorithms were added, unless they were
+ * Entries maintain the order in which algorithms were added, unless they were
* benchmarked and speed is provided, which then is used to order entries of
* the same algorithm.
+ * An exception are RNG entries, which are sorted by algorithm identifier.
*/
static void add_entry(private_crypto_factory_t *this, linked_list_t *list,
int algo, const char *plugin_name,
@@ -403,6 +403,7 @@ static void add_entry(private_crypto_factory_t *this, linked_list_t *list,
{
enumerator_t *enumerator;
entry_t *entry, *current;
+ bool sort = (list == this->rngs), found = FALSE;
INIT(entry,
.algo = algo,
@@ -415,12 +416,19 @@ static void add_entry(private_crypto_factory_t *this, linked_list_t *list,
enumerator = list->create_enumerator(list);
while (enumerator->enumerate(enumerator, &current))
{
- if (current->algo > algo)
+ if (sort && current->algo > algo)
{
break;
}
- else if (current->algo == algo && speed &&
- current->speed < speed)
+ else if (current->algo == algo)
+ {
+ if (speed > current->speed)
+ {
+ break;
+ }
+ found = TRUE;
+ }
+ else if (found)
{
break;
}