diff options
author | Tobias Brunner <tobias@strongswan.org> | 2012-10-18 17:15:32 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2012-10-24 16:09:42 +0200 |
commit | 4eba7269b830a2f2841dc11f5b688d409091cceb (patch) | |
tree | 8ee261ce8fff9df6efd345786e9f231cd40190d8 /src | |
parent | e74f184cb4b08328640551ff81a197dbffb74055 (diff) | |
download | strongswan-4eba7269b830a2f2841dc11f5b688d409091cceb.tar.bz2 strongswan-4eba7269b830a2f2841dc11f5b688d409091cceb.tar.xz |
proposal_t.strip_dh() takes a DH group to keep, using MODP_NONE will remove all
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/config/child_cfg.c | 4 | ||||
-rw-r--r-- | src/libcharon/config/proposal.c | 13 | ||||
-rw-r--r-- | src/libcharon/config/proposal.h | 4 |
3 files changed, 15 insertions, 6 deletions
diff --git a/src/libcharon/config/child_cfg.c b/src/libcharon/config/child_cfg.c index b675c908f..33d47a41e 100644 --- a/src/libcharon/config/child_cfg.c +++ b/src/libcharon/config/child_cfg.c @@ -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) diff --git a/src/libcharon/config/proposal.c b/src/libcharon/config/proposal.c index e12fed7ba..4803c7be2 100644 --- a/src/libcharon/config/proposal.c +++ b/src/libcharon/config/proposal.c @@ -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); } /** diff --git a/src/libcharon/config/proposal.h b/src/libcharon/config/proposal.h index 77e200acc..7733143a8 100644 --- a/src/libcharon/config/proposal.h +++ b/src/libcharon/config/proposal.h @@ -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. |