proposal_t.strip_dh() takes a DH group to keep, using MODP_NONE will remove all
authorTobias Brunner <tobias@strongswan.org>
Thu, 18 Oct 2012 15:15:32 +0000 (17:15 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 24 Oct 2012 14:09:42 +0000 (16:09 +0200)
src/libcharon/config/child_cfg.c
src/libcharon/config/proposal.c
src/libcharon/config/proposal.h

index b675c90..33d47a4 100644 (file)
@@ -165,7 +165,7 @@ METHOD(child_cfg_t, get_proposals, linked_list_t*,
                current = current->clone(current);
                if (strip_dh)
                {
-                       current->strip_dh(current);
+                       current->strip_dh(current, MODP_NONE);
                }
                proposals->insert_last(proposals, current);
        }
@@ -194,7 +194,7 @@ METHOD(child_cfg_t, select_proposal, proposal_t*,
                {
                        if (strip_dh)
                        {
-                               stored->strip_dh(stored);
+                               stored->strip_dh(stored, MODP_NONE);
                        }
                        selected = stored->select(stored, supplied, private);
                        if (selected)
index e12fed7..4803c7b 100644 (file)
@@ -232,14 +232,21 @@ METHOD(proposal_t, has_dh_group, bool,
 }
 
 METHOD(proposal_t, strip_dh, void,
-       private_proposal_t *this)
+       private_proposal_t *this, diffie_hellman_group_t keep)
 {
+       enumerator_t *enumerator;
        algorithm_t *alg;
 
-       while (this->dh_groups->remove_last(this->dh_groups, (void**)&alg) == SUCCESS)
+       enumerator = this->dh_groups->create_enumerator(this->dh_groups);
+       while (enumerator->enumerate(enumerator, (void**)&alg))
        {
-               free(alg);
+               if (alg->algorithm != keep)
+               {
+                       this->dh_groups->remove_at(this->dh_groups, enumerator);
+                       free(alg);
+               }
        }
+       enumerator->destroy(enumerator);
 }
 
 /**
index 77e200a..7733143 100644 (file)
@@ -111,8 +111,10 @@ struct proposal_t {
 
        /**
         * Strip DH groups from proposal to use it without PFS.
+        *
+        * @param keep                  group to keep (MODP_NONE to remove all)
         */
-       void (*strip_dh)(proposal_t *this);
+       void (*strip_dh)(proposal_t *this, diffie_hellman_group_t keep);
 
        /**
         * Compare two proposal, and select a matching subset.