- fixed bug in diffie hellman exchange (no public value was written)
This commit is contained in:
@@ -614,6 +614,7 @@ static status_t parse_body(private_message_t *this, crypter_t *crypter, signer_t
|
|||||||
if (status != SUCCESS)
|
if (status != SUCCESS)
|
||||||
{
|
{
|
||||||
this->logger->log(this->logger, ERROR, "payload type %s could not be verified",mapping_find(payload_type_m,current_payload_type));
|
this->logger->log(this->logger, ERROR, "payload type %s could not be verified",mapping_find(payload_type_m,current_payload_type));
|
||||||
|
current_payload->destroy(current_payload);
|
||||||
status = VERIFY_ERROR;
|
status = VERIFY_ERROR;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -627,12 +628,14 @@ static status_t parse_body(private_message_t *this, crypter_t *crypter, signer_t
|
|||||||
if (status != SUCCESS)
|
if (status != SUCCESS)
|
||||||
{
|
{
|
||||||
this->logger->log(this->logger, ERROR, "encryption payload signature invaild");
|
this->logger->log(this->logger, ERROR, "encryption payload signature invaild");
|
||||||
|
current_payload->destroy(current_payload);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
status = encryption_payload->decrypt(encryption_payload, crypter);
|
status = encryption_payload->decrypt(encryption_payload, crypter);
|
||||||
if (status != SUCCESS)
|
if (status != SUCCESS)
|
||||||
{
|
{
|
||||||
this->logger->log(this->logger, ERROR, "parsing decrypted encryption payload failed");
|
this->logger->log(this->logger, ERROR, "parsing decrypted encryption payload failed");
|
||||||
|
current_payload->destroy(current_payload);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ OBJS+= $(BUILD_DIR)auth_payload.o
|
|||||||
$(BUILD_DIR)auth_payload.o : $(PAYLOADS_DIR)auth_payload.c $(PAYLOADS_DIR)auth_payload.h
|
$(BUILD_DIR)auth_payload.o : $(PAYLOADS_DIR)auth_payload.c $(PAYLOADS_DIR)auth_payload.h
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
#OBJS+= $(BUILD_DIR)ts_payload.o
|
||||||
|
#$(BUILD_DIR)ts_payload.o : $(PAYLOADS_DIR)ts_payload.c $(PAYLOADS_DIR)ts_payload.h
|
||||||
|
# $(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
OBJS+= $(BUILD_DIR)payload.o
|
OBJS+= $(BUILD_DIR)payload.o
|
||||||
$(BUILD_DIR)payload.o : $(PAYLOADS_DIR)payload.c $(PAYLOADS_DIR)payload.h
|
$(BUILD_DIR)payload.o : $(PAYLOADS_DIR)payload.c $(PAYLOADS_DIR)payload.h
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file auth_payload.h
|
* @file auth_payload.h
|
||||||
*
|
*
|
||||||
* @brief Interface of auth_payload_t.
|
* @brief Implementation of auth_payload_t.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ struct private_id_payload_t {
|
|||||||
id_payload_t public;
|
id_payload_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TRUE if this ID payload is of type IDi, FALSE for IDr
|
* TRUE if this ID payload is of type IDi, FALSE for IDr.
|
||||||
*/
|
*/
|
||||||
bool is_initiator;
|
bool is_initiator;
|
||||||
|
|
||||||
|
|||||||
@@ -176,8 +176,6 @@ struct id_payload_t {
|
|||||||
/**
|
/**
|
||||||
* @brief Creates an empty id_payload_t object.
|
* @brief Creates an empty id_payload_t object.
|
||||||
*
|
*
|
||||||
* As default a ID payload of type IDi is created.
|
|
||||||
*
|
|
||||||
* @param is_initiator
|
* @param is_initiator
|
||||||
* - TRUE if this payload is of type IDi
|
* - TRUE if this payload is of type IDi
|
||||||
* - FALSE if this payload is of type IDr
|
* - FALSE if this payload is of type IDr
|
||||||
|
|||||||
@@ -141,6 +141,9 @@ encoding_rule_t proposal_substructure_encodings[] = {
|
|||||||
*/
|
*/
|
||||||
static status_t verify(private_proposal_substructure_t *this)
|
static status_t verify(private_proposal_substructure_t *this)
|
||||||
{
|
{
|
||||||
|
status_t status = SUCCESS;
|
||||||
|
iterator_t *iterator;
|
||||||
|
|
||||||
if ((this->next_payload != NO_PAYLOAD) && (this->next_payload != PROPOSAL_SUBSTRUCTURE))
|
if ((this->next_payload != NO_PAYLOAD) && (this->next_payload != PROPOSAL_SUBSTRUCTURE))
|
||||||
{
|
{
|
||||||
/* must be 0 or 2 */
|
/* must be 0 or 2 */
|
||||||
@@ -157,9 +160,26 @@ static status_t verify(private_proposal_substructure_t *this)
|
|||||||
/* reserved are not supported */
|
/* reserved are not supported */
|
||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iterator = this->transforms->create_iterator(this->transforms,TRUE);
|
||||||
|
|
||||||
|
while(iterator->has_next(iterator))
|
||||||
|
{
|
||||||
|
payload_t *current_transform;
|
||||||
|
iterator->current(iterator,(void **)¤t_transform);
|
||||||
|
|
||||||
|
status = current_transform->verify(current_transform);
|
||||||
|
if (status != SUCCESS)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
|
|
||||||
/* proposal number is checked in SA payload */
|
/* proposal number is checked in SA payload */
|
||||||
return SUCCESS;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ encoding_rule_t sa_payload_encodings[] = {
|
|||||||
static status_t verify(private_sa_payload_t *this)
|
static status_t verify(private_sa_payload_t *this)
|
||||||
{
|
{
|
||||||
int proposal_number = 1;
|
int proposal_number = 1;
|
||||||
status_t status;
|
status_t status = SUCCESS;
|
||||||
iterator_t *iterator;
|
iterator_t *iterator;
|
||||||
bool first = TRUE;
|
bool first = TRUE;
|
||||||
|
|
||||||
@@ -131,10 +131,7 @@ static status_t verify(private_sa_payload_t *this)
|
|||||||
while(iterator->has_next(iterator))
|
while(iterator->has_next(iterator))
|
||||||
{
|
{
|
||||||
proposal_substructure_t *current_proposal;
|
proposal_substructure_t *current_proposal;
|
||||||
status = iterator->current(iterator,(void **)¤t_proposal);
|
iterator->current(iterator,(void **)¤t_proposal);
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (current_proposal->get_proposal_number(current_proposal) > proposal_number)
|
if (current_proposal->get_proposal_number(current_proposal) > proposal_number)
|
||||||
{
|
{
|
||||||
if (first)
|
if (first)
|
||||||
@@ -158,6 +155,12 @@ static status_t verify(private_sa_payload_t *this)
|
|||||||
status = FAILED;
|
status = FAILED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = current_proposal->payload_interface.verify(&(current_proposal->payload_interface));
|
||||||
|
if (status != SUCCESS)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
first = FALSE;
|
first = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -148,7 +148,10 @@ encoding_rule_t transform_substructure_encodings[] = {
|
|||||||
*/
|
*/
|
||||||
static status_t verify(private_transform_substructure_t *this)
|
static status_t verify(private_transform_substructure_t *this)
|
||||||
{
|
{
|
||||||
if ((this->next_payload != NO_PAYLOAD) && (this->next_payload != TRANSFORM_SUBSTRUCTURE))
|
status_t status = SUCCESS;
|
||||||
|
iterator_t *iterator;
|
||||||
|
|
||||||
|
if ((this->next_payload != NO_PAYLOAD) && (this->next_payload != 3))
|
||||||
{
|
{
|
||||||
/* must be 0 or 3 */
|
/* must be 0 or 3 */
|
||||||
return FAILED;
|
return FAILED;
|
||||||
@@ -218,9 +221,25 @@ static status_t verify(private_transform_substructure_t *this)
|
|||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
iterator = this->attributes->create_iterator(this->attributes,TRUE);
|
||||||
|
|
||||||
|
while(iterator->has_next(iterator))
|
||||||
|
{
|
||||||
|
payload_t *current_attributes;
|
||||||
|
iterator->current(iterator,(void **)¤t_attributes);
|
||||||
|
|
||||||
|
status = current_attributes->verify(current_attributes);
|
||||||
|
if (status != SUCCESS)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
|
|
||||||
/* proposal number is checked in SA payload */
|
/* proposal number is checked in SA payload */
|
||||||
return SUCCESS;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -275,7 +275,6 @@ static status_t process_message(private_responder_init_t *this, message_t *messa
|
|||||||
payloads->destroy(payloads);
|
payloads->destroy(payloads);
|
||||||
return NOT_SUPPORTED;
|
return NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->logger->log(this->logger, CONTROL | MORE, "Set other DH public value");
|
this->logger->log(this->logger, CONTROL | MORE, "Set other DH public value");
|
||||||
|
|
||||||
dh->set_other_public_value(dh, ke_payload->get_key_exchange_data(ke_payload));
|
dh->set_other_public_value(dh, ke_payload->get_key_exchange_data(ke_payload));
|
||||||
@@ -425,6 +424,7 @@ static void build_ke_payload(private_responder_init_t *this, payload_t **payload
|
|||||||
this->diffie_hellman->get_my_public_value(this->diffie_hellman,&key_data);
|
this->diffie_hellman->get_my_public_value(this->diffie_hellman,&key_data);
|
||||||
|
|
||||||
ke_payload = ke_payload_create();
|
ke_payload = ke_payload_create();
|
||||||
|
ke_payload->set_key_exchange_data(ke_payload,key_data);
|
||||||
ke_payload->set_dh_group_number(ke_payload, MODP_1024_BIT);
|
ke_payload->set_dh_group_number(ke_payload, MODP_1024_BIT);
|
||||||
|
|
||||||
allocator_free_chunk(&key_data);
|
allocator_free_chunk(&key_data);
|
||||||
|
|||||||
Reference in New Issue
Block a user