- added compution of all needed keys and also creation of needed

transform objects
This commit is contained in:
Jan Hutter
2005-11-28 15:20:51 +00:00
parent 61068e9152
commit b9d9f18874
13 changed files with 390 additions and 158 deletions
+6 -91
View File
@@ -237,7 +237,7 @@ static status_t get_proposals_for_host(private_configuration_manager_t *this, ho
proposal->destroy(proposal);
return OUT_OF_RES;
}
transform->set_transform_type(transform, INTEGRITIY_ALGORITHM);
transform->set_transform_type(transform, INTEGRITY_ALGORITHM);
transform->set_transform_id(transform, AUTH_HMAC_MD5_96);
attribute = transform_attribute_create();
@@ -320,102 +320,17 @@ static status_t select_proposals_for_host(private_configuration_manager_t *this,
}
/**
* Implements function configuration_manager_t.get_transforms_for_host_and_proposals.
* Implements function configuration_manager_t.check_selected_proposals_for_host.
*/
static status_t get_transforms_for_host_and_proposals (private_configuration_manager_t *this, host_t *host, iterator_t *proposals,encryption_algorithm_t *encryption_algorithm,pseudo_random_function_t *pseudo_random_function, integrity_algorithm_t *integrity_algorithm)
static status_t check_selected_proposals_for_host (private_configuration_manager_t *this, host_t *host, iterator_t *proposals,bool *valid)
{
/*
* Currently the given proposals are not checked if they are valid for specific host!
*
* The first proposal is taken and the appropriate transform objects are created (only if they are supported)
* The first proposal is taken
*/
encryption_algorithm_t selected_encryption_algorithm = ENCR_UNDEFINED;
pseudo_random_function_t selected_pseudo_random_function = PRF_UNDEFINED;
integrity_algorithm_t selected_integrity_algorithm = AUTH_UNDEFINED;
proposal_substructure_t *proposal;
iterator_t *transforms;
status_t status;
this->logger->log(this->logger,CONTROL|MORE, "Going to get transforms for given proposal");
if (!proposals->has_next(proposals))
{
this->logger->log(this->logger,ERROR | MORE, "No proposal available");
return FAILED;
}
status = proposals->current(proposals,(void **) &(proposal));
if (status != SUCCESS)
{
this->logger->log(this->logger,ERROR, "Fatal error: could not get first proposal from iterator");
return status;
}
status = proposal->create_transform_substructure_iterator(proposal,&transforms,TRUE);
if (status != SUCCESS)
{
this->logger->log(this->logger,ERROR, "Fatal error: could not create iterator of transforms");
return status;
}
while (transforms->has_next(transforms))
{
transform_substructure_t *current_transform;
transform_type_t transform_type;
u_int16_t transform_id;
status = transforms->current(transforms,(void **) &(current_transform));
if (status != SUCCESS)
{
this->logger->log(this->logger,ERROR, "Fatal error: could not get current transform substructure object");
transforms->destroy(transforms);
return status;
}
transform_type = current_transform->get_transform_type(current_transform);
transform_id = current_transform->get_transform_id(current_transform);
this->logger->log(this->logger,CONTROL | MOST, "Going to process transform of type %s",mapping_find(transform_type_m,transform_type));
switch (transform_type)
{
case ENCRYPTION_ALGORITHM:
{
this->logger->log(this->logger,CONTROL | MORE, "Encryption algorithm: %s",mapping_find(encryption_algorithm_m,transform_id));
selected_encryption_algorithm = transform_id;
break;
}
case PSEUDO_RANDOM_FUNCTION:
{
this->logger->log(this->logger,CONTROL | MORE, "Create transform object for PRF of type %s",mapping_find(pseudo_random_function_m,transform_id));
selected_pseudo_random_function = transform_id;
break;
}
case INTEGRITIY_ALGORITHM:
{
this->logger->log(this->logger,CONTROL | MORE, "Integrity algorithm: %s",mapping_find(integrity_algorithm_m,transform_id));
selected_integrity_algorithm = transform_id;
break;
}
case DIFFIE_HELLMAN_GROUP:
{
this->logger->log(this->logger,CONTROL | MORE, "DH Group: %s",mapping_find(diffie_hellman_group_m,transform_id));
break;
}
default:
{
this->logger->log(this->logger,ERROR | MORE, "Transform type not supported!");
transforms->destroy(transforms);
return FAILED;
}
}
}
transforms->destroy(transforms);
*encryption_algorithm = selected_encryption_algorithm;
*pseudo_random_function = selected_pseudo_random_function;
*integrity_algorithm = selected_integrity_algorithm;
this->logger->log(this->logger,CONTROL|MORE, "Going to check selected proposals");
return SUCCESS;
}
@@ -472,7 +387,7 @@ configuration_manager_t *configuration_manager_create()
this->public.get_dh_group_number = (status_t(*)(configuration_manager_t*,char*,u_int16_t *, u_int16_t))get_dh_group_number;
this->public.get_proposals_for_host = (status_t(*)(configuration_manager_t*,host_t*,iterator_t*))get_proposals_for_host;
this->public.select_proposals_for_host = (status_t(*)(configuration_manager_t*,host_t*,iterator_t*,iterator_t*))select_proposals_for_host;
this->public.get_transforms_for_host_and_proposals = (status_t (*) (configuration_manager_t *, host_t *, iterator_t *,encryption_algorithm_t *,pseudo_random_function_t *, integrity_algorithm_t *)) get_transforms_for_host_and_proposals;
this->public.check_selected_proposals_for_host = (status_t (*) (configuration_manager_t *, host_t *, iterator_t *,bool *)) check_selected_proposals_for_host;
this->public.is_dh_group_allowed_for_host = (status_t(*)(configuration_manager_t*,host_t*,diffie_hellman_group_t,bool*)) is_dh_group_allowed_for_host;
/* private variables */
+14 -13
View File
@@ -137,23 +137,24 @@ struct configuration_manager_t {
status_t (*select_proposals_for_host) (configuration_manager_t *this, host_t *host, iterator_t *in, iterator_t *out);
/**
* Returns the transforms of type crypter_t, signer_t and prf_t as specified in given proposal.
* Checks if the selected proposals of a remote hosts are valid.
*
*
* @param this calling object
* @param host host information
* @param proposals iterator with selected proposals
* @param[out] encryption_algorithm
* @param[out] pseudo_random_function
* @param[out] integrity_algorithm
* @param this calling object
* @param host host information
* @param proposals iterator with selected proposals
* @param[out] valid TRUE if selected proposals are accepted
*
* @return
* - OUT_OF_RES
* - FAILED
* - NOT_FOUND (not yet implemented)
* - SUCCESS
* @return
* - OUT_OF_RES
* - FAILED
* - NOT_FOUND (not yet implemented)
* - SUCCESS
*/
status_t (*get_transforms_for_host_and_proposals) (configuration_manager_t *this, host_t *host, iterator_t *proposals,encryption_algorithm_t *encryption_algorithm,pseudo_random_function_t *pseudo_random_function, integrity_algorithm_t *integrity_algorithm);
status_t (*check_selected_proposals_for_host) (configuration_manager_t *this,
host_t *host,
iterator_t *proposals,
bool *valid);
/**
* Checks if a given dh_group number is allowed for a specific host