- fixed bug in diffie hellman exchange (no public value was written)

This commit is contained in:
Jan Hutter
2005-11-29 12:23:40 +00:00
parent e85220af90
commit 346af6f3de
9 changed files with 60 additions and 13 deletions
+3
View File
@@ -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.
* *
*/ */
+1 -1
View File
@@ -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 */
@@ -158,8 +161,25 @@ static status_t verify(private_proposal_substructure_t *this)
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 **)&current_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;
} }
/** /**
+8 -5
View File
@@ -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 **)&current_proposal); iterator->current(iterator,(void **)&current_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 **)&current_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;
} }
/** /**
+1 -1
View File
@@ -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);