aboutsummaryrefslogtreecommitdiffstats
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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;
}