aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/encoding/payloads/proposal_substructure.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-11-21 17:40:42 +0100
committerMartin Willi <martin@revosec.ch>2012-03-20 17:30:47 +0100
commitcc9629d87cb913d0587634b55b05dcf7129875b2 (patch)
treeb7fa0bebe9313d4dddf1fd1938fdc1828560306c /src/libcharon/encoding/payloads/proposal_substructure.c
parent12b6a68a5f78900fb1b14b97f826f55a7dee2817 (diff)
downloadstrongswan-cc9629d87cb913d0587634b55b05dcf7129875b2.tar.bz2
strongswan-cc9629d87cb913d0587634b55b05dcf7129875b2.tar.xz
Partially implemented IKEv1 ESP proposal en-/decoding
Diffstat (limited to 'src/libcharon/encoding/payloads/proposal_substructure.c')
-rw-r--r--src/libcharon/encoding/payloads/proposal_substructure.c75
1 files changed, 73 insertions, 2 deletions
diff --git a/src/libcharon/encoding/payloads/proposal_substructure.c b/src/libcharon/encoding/payloads/proposal_substructure.c
index aa3f0674f..8ef993138 100644
--- a/src/libcharon/encoding/payloads/proposal_substructure.c
+++ b/src/libcharon/encoding/payloads/proposal_substructure.c
@@ -616,7 +616,38 @@ static void add_to_proposal_v1_ike(proposal_t *proposal,
static void add_to_proposal_v1_esp(proposal_t *proposal,
transform_substructure_t *transform)
{
- /* TODO-IKEv1: create ESP proposals */
+ transform_attribute_type_t type;
+ transform_attribute_t *tattr;
+ enumerator_t *enumerator;
+ u_int16_t value, key_length = 0;
+
+ enumerator = transform->create_attribute_enumerator(transform);
+ while (enumerator->enumerate(enumerator, &tattr))
+ {
+ type = tattr->get_attribute_type(tattr);
+ value = tattr->get_value(tattr);
+ switch (type)
+ {
+ case TATTR_PH2_KEY_LENGTH:
+ key_length = value;
+ break;
+ case TATTR_PH2_AUTH_ALGORITHM:
+ proposal->add_algorithm(proposal, INTEGRITY_ALGORITHM,
+ get_alg_from_ikev1(INTEGRITY_ALGORITHM, value), 0);
+ break;
+ default:
+ /* TODO-IKEv1: lifetimes other attributes */
+ break;
+ }
+ }
+ enumerator->destroy(enumerator);
+
+ /* TODO-IKEv1: handle ESN attribute */
+ proposal->add_algorithm(proposal, EXTENDED_SEQUENCE_NUMBERS,
+ NO_EXT_SEQ_NUMBERS, 0);
+
+ proposal->add_algorithm(proposal, ENCRYPTION_ALGORITHM,
+ transform->get_transform_id(transform), key_length);
}
METHOD(proposal_substructure_t, get_proposal, proposal_t*,
@@ -794,7 +825,47 @@ static void set_from_proposal_v1_ike(private_proposal_substructure_t *this,
static void set_from_proposal_v1_esp(private_proposal_substructure_t *this,
proposal_t *proposal)
{
- /* TODO-IKEv1: add ESP proposal to transform substr */
+ transform_substructure_t *transform = NULL;
+ u_int16_t alg, key_size;
+ enumerator_t *enumerator;
+
+ enumerator = proposal->create_enumerator(proposal, ENCRYPTION_ALGORITHM);
+ if (enumerator->enumerate(enumerator, &alg, &key_size))
+ {
+ transform = transform_substructure_create_type(TRANSFORM_SUBSTRUCTURE_V1,
+ 0, alg);
+ if (key_size)
+ {
+ transform->add_transform_attribute(transform,
+ transform_attribute_create_value(TRANSFORM_ATTRIBUTE_V1,
+ TATTR_PH2_KEY_LENGTH, key_size));
+ }
+ }
+ enumerator->destroy(enumerator);
+ if (!transform)
+ {
+ return;
+ }
+
+ enumerator = proposal->create_enumerator(proposal, INTEGRITY_ALGORITHM);
+ while (enumerator->enumerate(enumerator, &alg, &key_size))
+ {
+ alg = get_ikev1_from_alg(INTEGRITY_ALGORITHM, alg);
+ if (alg)
+ {
+ transform->add_transform_attribute(transform,
+ transform_attribute_create_value(TRANSFORM_ATTRIBUTE_V1,
+ TATTR_PH2_AUTH_ALGORITHM, alg));
+ }
+ }
+ enumerator->destroy(enumerator);
+
+ /* TODO-IKEv1: Add lifetime and other attributes, non-fixes ESN */
+ transform->add_transform_attribute(transform,
+ transform_attribute_create_value(TRANSFORM_ATTRIBUTE_V1,
+ TATTR_PH2_EXT_SEQ_NUMBER, NO_EXT_SEQ_NUMBERS));
+
+ add_transform_substructure(this, transform);
}
/**