r3099 - in trunk: libmikey libmikey/include/libmikey libmikey/keyagreement libmikey/mikey libminisip/source/mediahandler

mikma at minisip.org mikma at minisip.org
Mon Jan 8 18:35:14 CET 2007


Author: mikma
Date: 2007-01-08 18:35:13 +0100 (Mon, 08 Jan 2007)
New Revision: 3099

Modified:
   trunk/libmikey/TODO
   trunk/libmikey/include/libmikey/MikeyException.h
   trunk/libmikey/include/libmikey/MikeyMessage.h
   trunk/libmikey/include/libmikey/MikeyPayload.h
   trunk/libmikey/include/libmikey/MikeyPayloadDH.h
   trunk/libmikey/include/libmikey/keyagreement.h
   trunk/libmikey/keyagreement/keyagreement.cxx
   trunk/libmikey/mikey/MikeyException.cxx
   trunk/libmikey/mikey/MikeyMessage.cxx
   trunk/libmikey/mikey/MikeyMessageDH.cxx
   trunk/libmikey/mikey/MikeyMessageDH.h
   trunk/libmikey/mikey/MikeyMessageDHHMAC.cxx
   trunk/libmikey/mikey/MikeyMessageDHHMAC.h
   trunk/libmikey/mikey/MikeyMessagePKE.cxx
   trunk/libmikey/mikey/MikeyMessagePKE.h
   trunk/libmikey/mikey/MikeyMessagePSK.cxx
   trunk/libmikey/mikey/MikeyMessagePSK.h
   trunk/libmikey/mikey/MikeyMessageRSAR.cxx
   trunk/libmikey/mikey/MikeyMessageRSAR.h
   trunk/libminisip/source/mediahandler/KeyAgreement.cxx
Log:
* Use MObject as base class of MikeyPayload and MikeyPayloads.
* And convert pointers to MRef<T>.


Modified: trunk/libmikey/TODO
===================================================================
--- trunk/libmikey/TODO	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/TODO	2007-01-08 17:35:13 UTC (rev 3099)
@@ -1,5 +1,3 @@
-* Implement PKE method
 * Implement rekeying
 * add a namespace
 * add a CallerInterface, to report errors
-* use MObject everywhere

Modified: trunk/libmikey/include/libmikey/MikeyException.h
===================================================================
--- trunk/libmikey/include/libmikey/MikeyException.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/include/libmikey/MikeyException.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -26,6 +26,8 @@
 #define MIKEYEXCEPTION_H
 
 #include<libmikey/libmikey_config.h>
+#include<libmikey/MikeyMessage.h>
+#include<libmutil/MemObject.h>
 
 
 /**
@@ -62,12 +64,12 @@
 class LIBMIKEY_API MikeyExceptionMessageContent: public MikeyException{
 	public:
 		MikeyExceptionMessageContent(const char* msg);
-		MikeyExceptionMessageContent(MikeyMessage * errMsg, const char* msg="");
+		MikeyExceptionMessageContent(MRef<MikeyMessage *> errMsg, const char* msg="");
 		virtual ~MikeyExceptionMessageContent()throw();
 
-		MikeyMessage * errorMessage();
+		MRef<MikeyMessage *> errorMessage();
 	private:
-		MikeyMessage * errorMessageValue;
+		MRef<MikeyMessage *> errorMessageValue;
 
 };
 

Modified: trunk/libmikey/include/libmikey/MikeyMessage.h
===================================================================
--- trunk/libmikey/include/libmikey/MikeyMessage.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/include/libmikey/MikeyMessage.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -28,6 +28,7 @@
 
 #include<libmikey/libmikey_config.h>
 
+#include<libmutil/MemObject.h>
 #include<libmikey/MikeyDefs.h>
 
 #include<assert.h>
@@ -72,14 +73,14 @@
 class KeyAgreementPKE;
 class KeyAgreementRSAR;
 
-class LIBMIKEY_API MikeyPayloads{
+class LIBMIKEY_API MikeyPayloads: public MObject{
 	public:
  		MikeyPayloads();
 		MikeyPayloads( int firstPayloadType, byte_t *message, int lengthLimit );
 		virtual ~MikeyPayloads();
 		
-		void addPayload( MikeyPayload * payload );
-		void operator+=( MikeyPayload * payload );
+		void addPayload( MRef<MikeyPayload*> payload );
+		void operator+=( MRef<MikeyPayload*> payload );
 		void addSignaturePayload( MRef<SipSim*> sim );
 		void addSignaturePayload( MRef<certificate *> cert );
 		bool verifySignature( MRef<certificate*> cert );
@@ -108,22 +109,22 @@
 		byte_t * rawMessageData();
 		int rawMessageLength();
 		
-		std::list<MikeyPayload *>::const_iterator firstPayload() const;
-		std::list<MikeyPayload *>::const_iterator lastPayload() const;
+		std::list<MRef<MikeyPayload*> >::const_iterator firstPayload() const;
+		std::list<MRef<MikeyPayload*> >::const_iterator lastPayload() const;
 
-		std::list<MikeyPayload *>::iterator firstPayload();
-		std::list<MikeyPayload *>::iterator lastPayload();
+		std::list<MRef<MikeyPayload*> >::iterator firstPayload();
+		std::list<MRef<MikeyPayload*> >::iterator lastPayload();
 		
-		MikeyPayload * extractPayload( int type );
-		const MikeyPayload * extractPayload( int type ) const;
-		void remove( MikeyPayload * );
+		MRef<MikeyPayload*> extractPayload( int type );
+		MRef<const MikeyPayload*> extractPayload( int type ) const;
+		void remove( MRef<MikeyPayload*> );
 
 		std::string b64Message();
 
 	protected:
 		static void parse( int firstPayloadType,
 				   byte_t *message, int lengthLimit, 
-				   std::list<MikeyPayload *>& payloads);
+				   std::list<MRef<MikeyPayload*> >& payloads);
 
 		void addPolicyToPayload(KeyAgreement * ka);
 		void addPolicyTo_ka(KeyAgreement * ka);
@@ -148,7 +149,7 @@
 				       uint64_t t,
 				       MikeyMessage* errorMessage );
 
-		std::list<MikeyPayload *> payloads;
+		std::list<MRef<MikeyPayload*> > payloads;
 
 	private:
 		void compile();
@@ -192,9 +193,9 @@
 		int type() const;
 		uint32_t csbId();
 
-		virtual MikeyMessage * parseResponse( KeyAgreement  * ka );
+		virtual MRef<MikeyMessage *> parseResponse( KeyAgreement  * ka );
 		virtual void setOffer( KeyAgreement * ka );
-		virtual MikeyMessage * buildResponse( KeyAgreement * ka );
+		virtual MRef<MikeyMessage *> buildResponse( KeyAgreement * ka );
 		virtual bool authenticate( KeyAgreement  * ka );
 
 		virtual bool isInitiatorMessage() const;

Modified: trunk/libmikey/include/libmikey/MikeyPayload.h
===================================================================
--- trunk/libmikey/include/libmikey/MikeyPayload.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/include/libmikey/MikeyPayload.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -28,12 +28,13 @@
 #include<libmikey/libmikey_config.h>
 
 #include<libmutil/mtypes.h>
+#include<libmutil/MemObject.h>
 
 #include<string>
 
 #define MIKEYPAYLOAD_LAST_PAYLOAD 0
 
-class LIBMIKEY_API MikeyPayload{
+class LIBMIKEY_API MikeyPayload: public MObject{
 	public:
 		static const int LastPayload;
 

Modified: trunk/libmikey/include/libmikey/MikeyPayloadDH.h
===================================================================
--- trunk/libmikey/include/libmikey/MikeyPayloadDH.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/include/libmikey/MikeyPayloadDH.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -29,6 +29,7 @@
 
 #include<libmikey/MikeyPayload.h>
 #include<libmikey/keyvalidity.h>
+#include<libmikey/MikeyMessage.h>
 
 #define MIKEYPAYLOAD_DH_PAYLOAD_TYPE 3
 

Modified: trunk/libmikey/include/libmikey/keyagreement.h
===================================================================
--- trunk/libmikey/include/libmikey/keyagreement.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/include/libmikey/keyagreement.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -133,10 +133,10 @@
 
 		/* Access the initiator and responder key agreement data
 		 * (MIKEY messages when using MIKEY) */
-		void * initiatorData();
-		void setInitiatorData( void * );
-		void * responderData();
-		void setResponderData( void * );
+		MRef<MikeyMessage *> initiatorData();
+		void setInitiatorData( MRef<MikeyMessage *> );
+		MRef<MikeyMessage *> responderData();
+		void setResponderData( MRef<MikeyMessage *> );
 
 
 		//Set the first Parameter Type in a new security policy. Returns the new Policy number.
@@ -206,8 +206,8 @@
 		uint8_t	CsIdMapType;
 
 
-		void * initiatorDataPtr;
-		void * responderDataPtr;
+		MRef<MikeyMessage *> initiatorDataPtr;
+		MRef<MikeyMessage *> responderDataPtr;
 
 		std::string authErrorValue;
 };

Modified: trunk/libmikey/keyagreement/keyagreement.cxx
===================================================================
--- trunk/libmikey/keyagreement/keyagreement.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/keyagreement/keyagreement.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -26,6 +26,7 @@
 #include<config.h>
 #include<libmikey/keyagreement.h>
 #include<libmikey/MikeyPayloadSP.h>
+#include<libmikey/MikeyMessage.h>
 #include<string.h>
 #include<libmcrypto/hmac.h>
 #include<libmcrypto/rand.h>
@@ -39,8 +40,7 @@
 	tgkPtr(NULL), tgkLengthValue(0),
 	randPtr(NULL), randLengthValue(0),
 	csbIdValue(0), 
-	csIdMapPtr(NULL), nCsValue(0),
-	initiatorDataPtr(NULL), responderDataPtr(NULL){
+	csIdMapPtr(NULL), nCsValue(0){
 	//policy = list<Policy_type *>::list();
 	kvPtr = new KeyValidityNull();
 
@@ -292,19 +292,19 @@
 	}
 }
 
-void * KeyAgreement::initiatorData(){
+MRef<MikeyMessage *> KeyAgreement::initiatorData(){
 	return initiatorDataPtr;
 }
 
-void KeyAgreement::setInitiatorData( void * data ){
+void KeyAgreement::setInitiatorData( MRef<MikeyMessage *> data ){
 	initiatorDataPtr = data;
 }
 
-void * KeyAgreement::responderData(){
+MRef<MikeyMessage *> KeyAgreement::responderData(){
 	return responderDataPtr;
 }
 
-void KeyAgreement::setResponderData( void * data ){
+void KeyAgreement::setResponderData( MRef<MikeyMessage *> data ){
 	responderDataPtr = data;
 }
 

Modified: trunk/libmikey/mikey/MikeyException.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyException.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyException.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -54,7 +54,7 @@
 
 }
 
-MikeyExceptionMessageContent::MikeyExceptionMessageContent(MikeyMessage * errMsg, const char* msg):MikeyException(msg),errorMessageValue(errMsg){
+MikeyExceptionMessageContent::MikeyExceptionMessageContent(MRef<MikeyMessage *> errMsg, const char* msg):MikeyException(msg),errorMessageValue(errMsg){
 
 }
 
@@ -63,7 +63,7 @@
 }
 
 
-MikeyMessage * MikeyExceptionMessageContent::errorMessage(){
+MRef<MikeyMessage *> MikeyExceptionMessageContent::errorMessage(){
         return errorMessageValue;
 }
 

Modified: trunk/libmikey/mikey/MikeyMessage.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessage.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessage.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -107,13 +107,18 @@
 
 MikeyMessage* MikeyMessage::parse( byte_t * message, int lengthLimit )
 {
-	std::list<MikeyPayload *> payloads;
+	std::list<MRef<MikeyPayload*> > payloads;
 
 	MikeyPayloads::parse( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE,
 			      message, lengthLimit, payloads );
 
+	if( payloads.size() == 0 ){
+		throw MikeyExceptionMessageContent( 
+			"No payloads" );
+	}
+
 	MikeyPayloadHDR *hdr =
-		dynamic_cast<MikeyPayloadHDR*>(*payloads.begin());
+		dynamic_cast<MikeyPayloadHDR*>(**payloads.begin());
 
 	if( !hdr ){
 		throw MikeyExceptionMessageContent( 
@@ -183,18 +188,12 @@
 	}
 	
 	rawData = NULL;
-	
-	list<MikeyPayload *>::iterator i;
 
-	for( i = payloads.begin() ; i != payloads.end() ; i++ ){
-		delete *i;
-		
-	}
 }
 
-static MikeyPayload* parsePayload( int payloadType,
+static MRef<MikeyPayload*> parsePayload( int payloadType,
 				   byte_t * msgpos, int limit ){
-	MikeyPayload* payload = NULL;
+	MRef<MikeyPayload*> payload = NULL;
 
 	switch (payloadType){
 		case MIKEYPAYLOAD_HDR_PAYLOAD_TYPE:
@@ -255,14 +254,16 @@
 
 void MikeyPayloads::parse( int firstPayloadType,
 			   byte_t * message, int lengthLimit,
-			  std::list<MikeyPayload *>& payloads ){
-	MikeyPayload * hdr;
+			  std::list<MRef<MikeyPayload*> >& payloads ){
+	MRef<MikeyPayload*> hdr;
 	byte_t * msgpos = message;
 	int limit = lengthLimit;
 						
-	payloads.push_back( hdr = parsePayload( firstPayloadType,
-						message, limit ) );
+	hdr = parsePayload( firstPayloadType,
+			    message, limit );
 	
+	payloads.push_back( hdr );	
+
 	limit -=  (int)( hdr->end() - msgpos );
 	msgpos = hdr->end();
 
@@ -271,7 +272,7 @@
 	while( !(msgpos >= message + lengthLimit ) && 
 			nextPayloadType != MikeyPayload::LastPayload){
 	
-		MikeyPayload *payload = parsePayload( nextPayloadType,
+		MRef<MikeyPayload*>payload = parsePayload( nextPayloadType,
 						      msgpos, limit );
 
 		nextPayloadType = payload->nextPayloadType();	
@@ -289,12 +290,12 @@
 			"the total length of payloads." );
 }
 
-void MikeyPayloads::addPayload(MikeyPayload *payload){
+void MikeyPayloads::addPayload(MRef<MikeyPayload*>payload){
 
 	compiled = false;
 	// Put the nextPayloadType in the previous payload */
 	if( payload->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
-		list<MikeyPayload *>::reverse_iterator i = payloads.rbegin();
+		list<MRef<MikeyPayload*> >::reverse_iterator i = payloads.rbegin();
 
 		if( i != payloads.rend() ){
 			(*i)->setNextPayloadType( payload->payloadType() );
@@ -304,7 +305,7 @@
 	payloads.push_back( payload );
 }
 
-void MikeyPayloads::operator +=( MikeyPayload * payload ){
+void MikeyPayloads::operator +=( MRef<MikeyPayload*> payload ){
 	addPayload( payload );
 }
 
@@ -313,7 +314,7 @@
 	byte_t signature[4096];
 	int signatureLength;
 	MikeyPayloadSIGN * sign;
-	MikeyPayload * last;
+	MRef<MikeyPayload*> last;
 	
 	// set the previous nextPayloadType to signature
 	last = *lastPayload();
@@ -339,7 +340,7 @@
 	byte_t signature[4096];
 	int signatureLength = sizeof(signature);
 	MikeyPayloadSIGN * sign;
-	MikeyPayload * last;
+	MRef<MikeyPayload*> last;
 	
 	// set the previous nextPayloadType to signature
 	last = *lastPayload();
@@ -368,7 +369,7 @@
 				     bool kemacOnly ){
 	byte_t * encrData = new byte_t[ tgkLength ];
 	AES * aes;
-	MikeyPayload * last;
+	MRef<MikeyPayload*> last;
 	
 	// set the previous nextPayloadType to KEMAC
 	last = * lastPayload();
@@ -449,7 +450,7 @@
 		unsigned int messageLength;
 		byte_t * messageData;
 
-	MikeyPayload * last;
+	MRef<MikeyPayload*> last;
 	// set the previous nextPayloadType to V
 	last = *lastPayload();
 	last->setNextPayloadType( MIKEYPAYLOAD_V_PAYLOAD_TYPE );
@@ -504,7 +505,7 @@
 
 	rawData = new byte_t[ rawMessageLength() ];	
 	
-	list<MikeyPayload *>::iterator i;
+	list<MRef<MikeyPayload*> >::iterator i;
 	byte_t *pos = rawData;
 	for (i=payloads.begin(); i!=payloads.end(); i++){
 		int len = (*i)->length();
@@ -522,7 +523,7 @@
 }
 
 int MikeyPayloads::rawMessageLength(){
-	list<MikeyPayload *>::iterator i;
+	list<MRef<MikeyPayload*> >::iterator i;
 	int length=0;
 	for (i=payloads.begin(); i!=payloads.end(); i++){
 		length+=(*i)->length();
@@ -543,7 +544,7 @@
 
 string MikeyPayloads::debugDump(){
 	string ret="";
-	list<MikeyPayload *>::iterator i;
+	list<MRef<MikeyPayload*> >::iterator i;
 	for (i=payloads.begin(); i!=payloads.end(); i++)
 	{
 		ret=ret+"\n\n"+(*i)->debugDump();
@@ -552,19 +553,19 @@
 	return ret;
 }
 
-list<MikeyPayload *>::const_iterator MikeyPayloads::firstPayload() const{
+list<MRef<MikeyPayload*> >::const_iterator MikeyPayloads::firstPayload() const{
 	return payloads.begin();
 }
 
-list<MikeyPayload *>::const_iterator MikeyPayloads::lastPayload() const{
+list<MRef<MikeyPayload*> >::const_iterator MikeyPayloads::lastPayload() const{
 	return --payloads.end();
 }
 
-list<MikeyPayload *>::iterator MikeyPayloads::firstPayload(){
+list<MRef<MikeyPayload*> >::iterator MikeyPayloads::firstPayload(){
 	return payloads.begin();
 }
 
-list<MikeyPayload *>::iterator MikeyPayloads::lastPayload(){
+list<MRef<MikeyPayload*> >::iterator MikeyPayloads::lastPayload(){
 	return --payloads.end();
 }
 
@@ -573,26 +574,26 @@
 }
 
 uint32_t MikeyMessage::csbId(){
-	MikeyPayload * hdr = * firstPayload();
+	MRef<MikeyPayload*> hdr = * firstPayload();
 	if( hdr->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 		throw MikeyExceptionMessageContent( 
 				"First payload was not a header" );
 	}
-	return ((MikeyPayloadHDR *)hdr)->csbId();
+	return dynamic_cast<MikeyPayloadHDR *>(*hdr)->csbId();
 }
 
 int MikeyMessage::type() const{
-	const MikeyPayload * hdr = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
-	if( hdr == NULL ){
+	MRef<const MikeyPayload*> hdr = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	if( hdr.isNull() ){
 		throw MikeyExceptionMessageContent( 
 			"No header in the payload" );
 	}
 
-	return ((MikeyPayloadHDR *)hdr)->dataType();
+	return dynamic_cast<const MikeyPayloadHDR *>(*hdr)->dataType();
 }
 
-MikeyPayload * MikeyPayloads::extractPayload( int payloadType ){
-	list<MikeyPayload *>::iterator i;
+MRef<MikeyPayload*> MikeyPayloads::extractPayload( int payloadType ){
+	list<MRef<MikeyPayload*> >::iterator i;
 
 	for( i = payloads.begin(); i != payloads.end(); i++ ){
 		if( (*i)->payloadType() == payloadType ){
@@ -602,19 +603,19 @@
 	return NULL;
 }
 
-const MikeyPayload * MikeyPayloads::extractPayload( int payloadType ) const{
-	list<MikeyPayload *>::const_iterator i;
+MRef<const MikeyPayload*> MikeyPayloads::extractPayload( int payloadType ) const{
+	list<MRef<MikeyPayload*> >::const_iterator i;
 
 	for( i = payloads.begin(); i != payloads.end(); i++ ){
 		if( (*i)->payloadType() == payloadType ){
-			return *i;
+			return **i;
 		}
 	}
 	return NULL;
 }
 
-void MikeyPayloads::remove( MikeyPayload * payload ){
-	list<MikeyPayload *>::iterator i;
+void MikeyPayloads::remove( MRef<MikeyPayload*> payload ){
+	list<MRef<MikeyPayload*> >::iterator i;
 
 	for( i = payloads.begin(); i != payloads.end(); i++ ){
 		if( *i == payload ){
@@ -647,12 +648,16 @@
 }
 
 void MikeyPayloads::addPolicyTo_ka(KeyAgreement * ka){
-#define SP ((MikeyPayloadSP *)i)
+#define SP dynamic_cast<MikeyPayloadSP *>(*i)
 	// Adding policy to ka
 	int policy_i, policy_j;
 	MikeyPolicyParam * PParam;
-	MikeyPayload * i;
-	while ((i = extractPayload( MIKEYPAYLOAD_SP_PAYLOAD_TYPE )) != NULL){
+	MRef<MikeyPayload*> i;
+	while ( 1 ){
+		i = extractPayload( MIKEYPAYLOAD_SP_PAYLOAD_TYPE );
+		if( i.isNull() ){
+			break;
+		}
 		policy_i = 0;
 		policy_j = 0;
 		while (policy_i < SP->noOfPolicyParam()){
@@ -667,7 +672,7 @@
 #undef SP
 }
 
-MikeyMessage * MikeyMessage::parseResponse( KeyAgreement  * ka ){
+MRef<MikeyMessage *> MikeyMessage::parseResponse( KeyAgreement  * ka ){
 	throw MikeyExceptionUnimplemented( "parseResponse not implemented" );
 }
 
@@ -675,7 +680,7 @@
 	throw MikeyExceptionUnimplemented( "setOffer not implemented" );
 }
 
-MikeyMessage * MikeyMessage::buildResponse( KeyAgreement * ka ){
+MRef<MikeyMessage *> MikeyMessage::buildResponse( KeyAgreement * ka ){
 	throw MikeyExceptionUnimplemented( "buildResponse not implemented" );
 }
 
@@ -768,6 +773,9 @@
 	}
 
 	ka->macAlg = macAlg;
+	if( ka->authKey ){
+		delete[] ka->authKey;
+	}
 	ka->authKey = authKey;
 	ka->authKeyLength = authKeyLength;
 	return !error;
@@ -783,7 +791,7 @@
 	certChain->init_index();
 	MRef<certificate*> cert = certChain->get_next();
 	while( ! cert.isNull() ){
-		MikeyPayload* payload =
+		MRef<MikeyPayload*> payload =
 			new MikeyPayloadCERT( MIKEYPAYLOAD_CERT_TYPE_X509V3SIGN,
 					      cert);
 		addPayload( payload );
@@ -798,17 +806,17 @@
 	MRef<certificate_chain *> peerChain;
 
 	/* Try to find the certificate chain in the message */
-	list<MikeyPayload *>::const_iterator i;
-	list<MikeyPayload *>::const_iterator last = lastPayload();
+	list<MRef<MikeyPayload*> >::const_iterator i;
+	list<MRef<MikeyPayload*> >::const_iterator last = lastPayload();
 
 	for( i = firstPayload(); i != last; i++ ){
-		MikeyPayload *payload = *i;
+		MRef<MikeyPayload*> payload = *i;
 
 		if( payload->payloadType() != MIKEYPAYLOAD_CERT_PAYLOAD_TYPE )
 			continue;
 
 		MikeyPayloadCERT * certPayload =
-			dynamic_cast<MikeyPayloadCERT*>(payload);
+			dynamic_cast<MikeyPayloadCERT*>(*payload);
 		MRef<certificate*> peerCert = 
 			certificate::load( certPayload->certData(),
 					   certPayload->certLength() );
@@ -826,12 +834,15 @@
 }
 
 bool MikeyPayloads::verifySignature( MRef<certificate*> cert ){
-	MikeyPayloadSIGN* sig = dynamic_cast<MikeyPayloadSIGN*>(extractPayload(MIKEYPAYLOAD_SIGN_PAYLOAD_TYPE));
+	MRef<MikeyPayload*> payload =
+		extractPayload(MIKEYPAYLOAD_SIGN_PAYLOAD_TYPE);
 
-	if( !sig ){
-		return false;
+	if( !payload ){
+		throw MikeyExceptionMessageContent( "No SIGN payload" );
 	}
-		
+
+	MikeyPayloadSIGN* sig = dynamic_cast<MikeyPayloadSIGN*>(*payload);
+
 	int res = cert->verif_sign( rawMessageData(),
 				    rawMessageLength() - sig->sigLength(),
 				    sig->sigData(),
@@ -845,14 +856,18 @@
 	byte_t * receivedMac;
 	byte_t * macInput;
 	unsigned int macInputLength;
-	MikeyPayloadKEMAC * kemac;
 
-	kemac = dynamic_cast<MikeyPayloadKEMAC *>(extractPayload(MIKEYPAYLOAD_KEMAC_PAYLOAD_TYPE));
+	MRef<MikeyPayload*> payload =
+		extractPayload(MIKEYPAYLOAD_KEMAC_PAYLOAD_TYPE);
 
-	if( !kemac ){
-		return false;
+	if( !payload ){
+		throw MikeyExceptionMessageContent("No KEMAC payload");
 	}
 
+	MikeyPayloadKEMAC * kemac;
+
+	kemac = dynamic_cast<MikeyPayloadKEMAC *>(*payload);
+
 	macAlg = kemac->macAlg();
 	receivedMac = kemac->macData();
 		
@@ -883,13 +898,15 @@
 	unsigned int macInputLength;
 	MikeyPayloadV * v;
 	uint64_t t_sent = ka->tSent();
+	MRef<MikeyPayload*> payload =
+		extractPayload(MIKEYPAYLOAD_V_PAYLOAD_TYPE);
 
-	v = dynamic_cast<MikeyPayloadV*>(extractPayload(MIKEYPAYLOAD_V_PAYLOAD_TYPE));
-
-	if( !v ){
-		return false;
+	if( !payload ){
+		throw MikeyExceptionMessageContent("No V payload");
 	}
 
+	v = dynamic_cast<MikeyPayloadV*>(*payload);
+
 	macAlg = v->macAlg();
 	receivedMac = v->verData();
 	// macInput = raw_messsage without mac / sent_t
@@ -976,6 +993,16 @@
 	addKemacPayload(rawKeyData, rawKeyDataLength,
 			encrKey, iv, ka->authKey, encrAlg, macAlg, true );
 
+	if( encrKey ){
+		delete[] encrKey;
+		encrKey = NULL;
+	}
+
+	if( iv ){
+		delete[] iv;
+		iv = NULL;
+	}
+
 	delete subPayloads;
 	subPayloads = NULL;
 
@@ -1002,10 +1029,14 @@
 }
 
 bool MikeyPayloads::extractPkeEnvKey( KeyAgreementPKE* ka ) const{
-	const MikeyPayload *payloadPke =
+	MRef<const MikeyPayload*> payloadPke =
 		extractPayload( MIKEYPAYLOAD_PKE_PAYLOAD_TYPE );
+	if( !payloadPke ){
+		throw MikeyException( "PKE init did not contain PKE payload" );
+	}
+
 	const MikeyPayloadPKE *pke =
-		dynamic_cast<const MikeyPayloadPKE*>( payloadPke );
+		dynamic_cast<const MikeyPayloadPKE*>( *payloadPke );
 
 	if( !pke ){
 		throw MikeyException( "PKE init did not contain PKE payload" );

Modified: trunk/libmikey/mikey/MikeyMessageDH.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessageDH.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessageDH.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien, Joachim Orrblad
+  Copyright (C) 2006 Mikael Magnusson
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -20,6 +21,7 @@
  * Authors: Erik Eliasson <eliasson at it.kth.se>
  *          Johan Bilien <jobi at via.ecp.fr>
  *	    Joachim Orrblad <joachim at orrblad.com>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
 */
 
 
@@ -96,16 +98,16 @@
 				"Not a DH keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		throw MikeyExceptionMessageContent(
 				"DH init message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)i)
+#define hdr ((MikeyPayloadHDR *)*i)
 	if( hdr->dataType() != HDR_DATA_TYPE_DH_INIT )
 		throw MikeyExceptionMessageContent( 
 				"Expected DH init message" );
@@ -134,14 +136,14 @@
 	
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
 	// FIXME i can be NULL
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+	if( ((MikeyPayloadT*)*i)->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
@@ -153,15 +155,14 @@
 
 	i = extractPayload( MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
-	// FIXME i can be NULL
-	ka->setRand( ((MikeyPayloadRAND *)i)->randData(),
-		     ((MikeyPayloadRAND *)i)->randLength() );
+	ka->setRand( ((MikeyPayloadRAND *)*i)->randData(),
+		     ((MikeyPayloadRAND *)*i)->randLength() );
 
 	payloads.remove( i );
 
@@ -192,31 +193,33 @@
 
 	i = extractPayload( MIKEYPAYLOAD_DH_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
+#define dh ((MikeyPayloadDH*)*i)
 
 	// FIXME i can be NULL
-	if( ka->group() != ((MikeyPayloadDH *)i)->group() ){
-		ka->setGroup( ((MikeyPayloadDH *)i)->group() );
+	if( ka->group() != dh->group() ){
+		ka->setGroup( dh->group() );
 	}
 
-	ka->setPeerKey( ((MikeyPayloadDH *)i)->dhKey(),
-		        ((MikeyPayloadDH *)i)->dhKeyLength() );
+	ka->setPeerKey( dh->dhKey(),
+		        dh->dhKeyLength() );
 	
-	ka->setKeyValidity( ((MikeyPayloadDH *)i)->kv() );
+	ka->setKeyValidity( dh->kv() );
 	
 	payloads.remove( i );
+#undef dh
 
 }
 //-----------------------------------------------------------------------------------------------//
 //
 //-----------------------------------------------------------------------------------------------//
 
-MikeyMessage * MikeyMessageDH::buildResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessageDH::buildResponse( KeyAgreement * kaBase ){
 	KeyAgreementDH* ka = dynamic_cast<KeyAgreementDH*>(kaBase);
 
 	if( !ka ){
@@ -225,7 +228,7 @@
 	}
 
 	// Build the response message
-	MikeyMessage * result = new MikeyMessage();
+	MRef<MikeyMessage *> result = new MikeyMessage();
 	result->addPayload( 
 			new MikeyPayloadHDR( HDR_DATA_TYPE_DH_RESP, 0, 
 			HDR_PRF_MIKEY_1, ka->csbId(),
@@ -258,7 +261,7 @@
 	return result;
 }
 
-MikeyMessage * MikeyMessageDH::parseResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessageDH::parseResponse( KeyAgreement * kaBase ){
 	KeyAgreementDH* ka = dynamic_cast<KeyAgreementDH*>(kaBase);
 
 	if( !ka ){
@@ -266,19 +269,19 @@
 				"Not a DH keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
 	bool gotDhi = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 	MRef<MikeyCsIdMap *> csIdMap;
 	uint8_t nCs;
 	
-	if( i == NULL ){
+	if( i.isNull() ){
 		throw MikeyExceptionMessageContent(
 				"DH resp message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_DH_RESP ){
 		throw MikeyExceptionMessageContent( 
 				"Expected DH resp message" );
@@ -305,14 +308,14 @@
 	payloads.remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
 	// FIXME i can be NULL
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+	if( ((MikeyPayloadT*)*i)->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
@@ -342,14 +345,14 @@
 
 	i = extractPayload( MIKEYPAYLOAD_DH_PAYLOAD_TYPE );
 	
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload(
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
 	// FIXME i can be NULL
-#define dh ((MikeyPayloadDH *)i)
+#define dh ((MikeyPayloadDH *)*i)
 	if( string( (const char *)dh->dhKey(), 
 				  dh->dhKeyLength() ) ==
 	    string( (const char *)ka->publicKey(), 
@@ -366,7 +369,7 @@
 	payloads.remove( i );
 	i = extractPayload( MIKEYPAYLOAD_DH_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload(
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
@@ -399,8 +402,6 @@
 		throw MikeyExceptionMessageContent( errorMessage );
 	}
 
-	delete errorMessage;
-
 	return NULL;
 }
 
@@ -412,7 +413,7 @@
 				"Not a DH keyagreement" );
 	}
 
-	MikeyPayload * sign = (*lastPayload());
+	MRef<MikeyPayload *> sign = (*lastPayload());
 
 	// Fetch peer certificate chain
 	MRef<certificate_chain *> peerCert = ka->peerCertificateChain();
@@ -432,11 +433,12 @@
 		return true;
 	}
 
+#define signPl ((MikeyPayloadSIGN*)*sign)
 	int res; 
 	res = peerCert->get_first()->verif_sign( rawMessageData(),
-												rawMessageLength() - ((MikeyPayloadSIGN *)sign)->sigLength(),
-												((MikeyPayloadSIGN *)sign)->sigData(),
-												((MikeyPayloadSIGN *)sign)->sigLength() );
+												rawMessageLength() - signPl->sigLength(),
+												signPl->sigData(),
+												signPl->sigLength() );
 	if( res > 0 ) return false;
 	else return true;
 }

Modified: trunk/libmikey/mikey/MikeyMessageDH.h
===================================================================
--- trunk/libmikey/mikey/MikeyMessageDH.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessageDH.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -36,9 +36,9 @@
 		MikeyMessageDH();
  		MikeyMessageDH( KeyAgreementDH * ka );
 
-		MikeyMessage * parseResponse( KeyAgreement  * ka );
+		MRef<MikeyMessage *> parseResponse( KeyAgreement  * ka );
 		void setOffer( KeyAgreement * ka );
-		MikeyMessage * buildResponse( KeyAgreement * ka );
+		MRef<MikeyMessage *> buildResponse( KeyAgreement * ka );
 		bool authenticate( KeyAgreement  * ka );
 
 		bool isInitiatorMessage() const;

Modified: trunk/libmikey/mikey/MikeyMessageDHHMAC.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessageDHHMAC.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessageDHHMAC.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -106,16 +106,16 @@
 				"Not a DHHMAC keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		throw MikeyExceptionMessageContent(
 				"DHHMAC init message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)i)
+#define hdr ((MikeyPayloadHDR *)*i)
 	if( hdr->dataType() != HDR_DATA_TYPE_DHHMAC_INIT )
 		throw MikeyExceptionMessageContent( 
 				"Expected DHHMAC init message" );
@@ -144,75 +144,83 @@
 	
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT*)*i)
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}
 	
 	payloads.remove( i );
+#undef plT
 
 	addPolicyTo_ka(ka); //Is in MikeyMessage.cxx
 
 	i = extractPayload( MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
-	ka->setRand( ((MikeyPayloadRAND *)i)->randData(),
-		     ((MikeyPayloadRAND *)i)->randLength() );
+#define plRand ((MikeyPayloadRAND*)*i)
+	ka->setRand( plRand->randData(),
+		     plRand->randLength() );
 
 	payloads.remove( i );
+#undef plRand
 
 
 	//FIXME treat the case of an ID payload
 	i = extractPayload( MIKEYPAYLOAD_ID_PAYLOAD_TYPE );
-	if( i != NULL ){
+	if( !i.isNull() ){
 		payloads.remove( i );
 	}
 
 	i = extractPayload( MIKEYPAYLOAD_DH_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
-	if( ka->group() != ((MikeyPayloadDH *)i)->group() ){
-		if( ka->setGroup( ((MikeyPayloadDH *)i)->group() ) ){
+#define plDH ((MikeyPayloadDH*)*i)
+	if( ka->group() != plDH->group() ){
+		if( ka->setGroup( plDH->group() ) ){
 			error = true;
 			errorMessage->addPayload(
 				new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_DH ) );
 		}
 	}
 
-	ka->setPeerKey( ((MikeyPayloadDH *)i)->dhKey(),
-		        ((MikeyPayloadDH *)i)->dhKeyLength() );
+	ka->setPeerKey( plDH->dhKey(),
+		        plDH->dhKeyLength() );
 	
-	ka->setKeyValidity( ((MikeyPayloadDH *)i)->kv() );
+	ka->setKeyValidity( plDH->kv() );
 	
 	payloads.remove( i );
+#undef plDH
 
 	i = extractPayload( MIKEYPAYLOAD_KEMAC_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+#define plKemac ((MikeyPayloadKEMAC*)*i)
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 	else{
-		ka->macAlg = ((MikeyPayloadKEMAC*)i)->macAlg();;
+		ka->macAlg = plKemac->macAlg();;
 	}
+#undef plKemac
 
 	if( error ){
 		throw MikeyExceptionMessageContent( errorMessage );
@@ -224,7 +232,7 @@
 //
 //-----------------------------------------------------------------------------------------------//
 
-MikeyMessage * MikeyMessageDHHMAC::buildResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessageDHHMAC::buildResponse( KeyAgreement * kaBase ){
 	KeyAgreementDHHMAC* ka = dynamic_cast<KeyAgreementDHHMAC*>(kaBase);
 
 	if( !ka ){
@@ -233,7 +241,7 @@
 	}
 
 	// Build the response message
-	MikeyMessage * result = new MikeyMessage();
+	MRef<MikeyMessage *> result = new MikeyMessage();
 	result->addPayload( 
 			new MikeyPayloadHDR( HDR_DATA_TYPE_DHHMAC_RESP, 0, 
 			HDR_PRF_MIKEY_1, ka->csbId(),
@@ -274,7 +282,7 @@
 	return result;
 }
 
-MikeyMessage * MikeyMessageDHHMAC::parseResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessageDHHMAC::parseResponse( KeyAgreement * kaBase ){
 	KeyAgreementDHHMAC* ka = dynamic_cast<KeyAgreementDHHMAC*>(kaBase);
 
 	if( !ka ){
@@ -282,19 +290,19 @@
 				"Not a DHHMAC keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
 	bool gotDhi = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 	MRef<MikeyCsIdMap *> csIdMap;
 	uint8_t nCs;
 	
-	if( i == NULL ){
+	if( i.isNull() ){
 		throw MikeyExceptionMessageContent(
 				"DHHMAC resp message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_DHHMAC_RESP ){
 		throw MikeyExceptionMessageContent( 
 				"Expected DHHMAC resp message" );
@@ -321,36 +329,38 @@
 	payloads.remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT *)(*i))
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}
 
 	payloads.remove( i );
+#undef plT
 
 	addPolicyTo_ka(ka); //Is in MikeyMessage.cxx
 
 	i = extractPayload( MIKEYPAYLOAD_ID_PAYLOAD_TYPE );
-	if( i != NULL ){
+	if( !i.isNull() ){
 		payloads.remove( i );
 	}
 
 	i = extractPayload( MIKEYPAYLOAD_DH_PAYLOAD_TYPE );
 	
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload(
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}
 
-#define dh ((MikeyPayloadDH *)i)
+#define dh ((MikeyPayloadDH *)*i)
 	if( string( (const char *)dh->dhKey(), 
 				  dh->dhKeyLength() ) ==
 	    string( (const char *)ka->publicKey(), 
@@ -367,7 +377,7 @@
 	payloads.remove( i );
 	i = extractPayload( MIKEYPAYLOAD_DH_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload(
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
@@ -393,8 +403,6 @@
 		throw MikeyExceptionMessageContent( errorMessage );
 	}
 
-	delete errorMessage;
-
 // 	ka->computeTgk();
 
 	return NULL;
@@ -408,15 +416,13 @@
 				"Not a DHHMAC keyagreement" );
 	}
 
-	MikeyPayload * payload = *(lastPayload());
+	MRef<MikeyPayload *> payload = *(lastPayload());
  
 	if( ka->rand() == NULL ){
+		MRef<MikeyPayload *> pl =
+			extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 		
-		MikeyPayloadRAND * randPayload;
-		
-		randPayload = (MikeyPayloadRAND*) extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
-		
-		if( randPayload == NULL ){
+		if( pl.isNull() ){
 			ka->setAuthError(
 				"The MIKEY init has no"
 				"RAND payload."
@@ -425,6 +431,10 @@
 			return true;
 		}
 
+		MikeyPayloadRAND * randPayload;
+		
+		randPayload = (MikeyPayloadRAND*)*pl;
+		
 		ka->setRand( randPayload->randData(), 
 			     randPayload->randLength() );
 	}

Modified: trunk/libmikey/mikey/MikeyMessageDHHMAC.h
===================================================================
--- trunk/libmikey/mikey/MikeyMessageDHHMAC.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessageDHHMAC.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -42,9 +42,9 @@
 		MikeyMessageDHHMAC( KeyAgreementDHHMAC * ka,
 				    int macAlg  = MIKEY_MAC_HMAC_SHA1_160 );
 
-		MikeyMessage * parseResponse( KeyAgreement  * ka );
+		MRef<MikeyMessage *> parseResponse( KeyAgreement  * ka );
 		void setOffer( KeyAgreement * ka );
-		MikeyMessage * buildResponse( KeyAgreement * ka );
+		MRef<MikeyMessage *> buildResponse( KeyAgreement * ka );
 		bool authenticate( KeyAgreement  * ka );
 
 		bool isInitiatorMessage() const;

Modified: trunk/libmikey/mikey/MikeyMessagePKE.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessagePKE.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessagePKE.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -101,20 +101,20 @@
 				"Not a PKE keyagreement" );
 	}
 
-	MikeyPayload* i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload*> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
 	//uint32_t csbId;
 	MRef<MikeyCsIdMap*> csIdMap;
-	MikeyMessage* errorMessage = new MikeyMessage();
+	MRef<MikeyMessage*> errorMessage = new MikeyMessage();
 	//uint8_t nCs;
 
-	if( i == NULL || 
+	if( i.isNull() || 
 		i->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 		throw MikeyExceptionMessageContent( 
 				"PKE init message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_PK_INIT ){
 		throw MikeyExceptionMessageContent( 
 				"Expected PKE init message" );
@@ -146,52 +146,56 @@
 	remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL )
+	if( i.isNull() )
 		throw MikeyExceptionMessageContent( 
 				"PKE init message had no T payload" );
 
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT *)(*i))
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}	
 
-	ka->t_received = ((MikeyPayloadT*)i)->ts();
+	ka->t_received = plT->ts();
 	
 	remove( i );
+#undef plT
 
 	addPolicyTo_ka(ka); //Is in MikeyMessage.cxx
 
 	i = extractPayload( MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
+#define plRand ((MikeyPayloadRAND *)*i)
 	// FIXME i can be NULL
-	ka->setRand( ((MikeyPayloadRAND *)i)->randData(),
-			((MikeyPayloadRAND *)i)->randLength() );
+	ka->setRand( plRand->randData(),
+			plRand->randLength() );
 
 	remove( i );
+#undef plRand
 	i = extractPayload( MIKEYPAYLOAD_ID_PAYLOAD_TYPE );
 
 	//FIXME treat the case of an ID payload
-	if( i != NULL ){
+	if( !i.isNull() ){
 		remove( i );
 	}
 
 	i = extractPayload( MIKEYPAYLOAD_KEMAC_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
 	// FIXME i can be NULL
-#define kemac ((MikeyPayloadKEMAC *)i)
+#define kemac ((MikeyPayloadKEMAC *)*i)
 	int encrAlg = kemac->encrAlg();
 	int macAlg  = kemac->macAlg();
 	ka->macAlg = macAlg;
@@ -203,7 +207,7 @@
 	
 	if( !deriveTranspKeys( ka, encrKey, iv, encrKeyLength,
 			      encrAlg, macAlg, ka->t_received,
-			      errorMessage ) ){
+			      *errorMessage ) ){
 		if( encrKey != NULL )
 			delete [] encrKey;
 		if( iv != NULL )
@@ -221,12 +225,16 @@
 	}
 	
 	// decrypt the TGK
-	MikeyPayloads* subPayloads = 
+	MRef<MikeyPayloads*> subPayloads = 
 		kemac->decodePayloads( MIKEYPAYLOAD_ID_PAYLOAD_TYPE,
 				 encrKey, encrKeyLength, iv );
-	
+
+	MRef<MikeyPayload *> plKeyData =
+		subPayloads->extractPayload( MIKEYPAYLOAD_KEYDATA_PAYLOAD_TYPE );
+
+	// FIXME check null
 	MikeyPayloadKeyData *keyData =
-		dynamic_cast<MikeyPayloadKeyData*>(subPayloads->extractPayload( MIKEYPAYLOAD_KEYDATA_PAYLOAD_TYPE ));
+		dynamic_cast<MikeyPayloadKeyData*>(*plKeyData);
 
 	int tgkLength = keyData->keyDataLength();
 	byte_t * tgk = keyData->keyData();
@@ -241,7 +249,7 @@
 		delete [] iv;
 }
 
-MikeyMessage* MikeyMessagePKE::buildResponse(KeyAgreement* kaBase){
+MRef<MikeyMessage*> MikeyMessagePKE::buildResponse(KeyAgreement* kaBase){
 	KeyAgreementPKE* ka = dynamic_cast<KeyAgreementPKE*>(kaBase);
 
 	if( !ka ){
@@ -251,7 +259,7 @@
 	
 	if( ka->getV() || ka->getCsIdMapType() == HDR_CS_ID_MAP_TYPE_IPSEC4_ID ){
 		// Build the response message
-		MikeyMessage * result = new MikeyMessage();
+		MRef<MikeyMessage *> result = new MikeyMessage();
 		result->addPayload( 
 			new MikeyPayloadHDR( HDR_DATA_TYPE_PK_RESP, 0, 
 			HDR_PRF_MIKEY_1, ka->csbId(),
@@ -282,7 +290,7 @@
 	return NULL;
 }
 
-MikeyMessage * MikeyMessagePKE::parseResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessagePKE::parseResponse( KeyAgreement * kaBase ){
 	KeyAgreementPKE* ka = dynamic_cast<KeyAgreementPKE*>(kaBase);
 
 	if( !ka ){
@@ -290,20 +298,20 @@
 				"Not a PKE keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 	MRef<MikeyCsIdMap *> csIdMap;
 	uint8_t nCs;
 	
-	if( i == NULL ||
+	if( i.isNull() ||
 		i->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 
 		throw MikeyExceptionMessageContent( 
 				"PKE response message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_PK_RESP )
 		throw MikeyExceptionMessageContent( 
 				"Expected PKE response message" );
@@ -330,20 +338,22 @@
 	remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
+#define plT ((MikeyPayloadT*)*i)
 	// FIXME i can be NULL
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}	
 
-	uint64_t t_received = ((MikeyPayloadT*)i)->ts();
+	uint64_t t_received = plT->ts();
+#undef plT
 
 	if( error ){
 		byte_t authKey[20];
@@ -368,16 +378,15 @@
 				"Not a PKE keyagreement" );
 	}
 	
-	MikeyPayload * payload = *(lastPayload());
+	MRef<MikeyPayload *> payload = *(lastPayload());
 	list<MikeyPayload *>::iterator payload_i;
  
 	if( ka->rand() == NULL ){
 		
-		MikeyPayloadRAND * randPayload;
+		MRef<MikeyPayload *> pl =
+			extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 		
-		randPayload = (MikeyPayloadRAND*) extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
-		
-		if( randPayload == NULL ){
+		if( pl.isNull() ){
 			ka->setAuthError(
 				"The MIKEY init has no"
 				"RAND payload."
@@ -386,6 +395,10 @@
 			return true;
 		}
 
+		MikeyPayloadRAND * randPayload;
+		
+		randPayload = (MikeyPayloadRAND*)*pl;
+
 		ka->setRand( randPayload->randData(), 
 			     randPayload->randLength() );
 	}

Modified: trunk/libmikey/mikey/MikeyMessagePKE.h
===================================================================
--- trunk/libmikey/mikey/MikeyMessagePKE.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessagePKE.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -39,9 +39,9 @@
 				int encrAlg = MIKEY_ENCR_AES_CM_128,
 				int macAlg = MIKEY_MAC_HMAC_SHA1_160 );
 
-		MikeyMessage * parseResponse( KeyAgreement  * ka );
+		MRef<MikeyMessage *> parseResponse( KeyAgreement  * ka );
 		void setOffer( KeyAgreement * ka );
-		MikeyMessage * buildResponse( KeyAgreement * ka );
+		MRef<MikeyMessage *> buildResponse( KeyAgreement * ka );
 		bool authenticate( KeyAgreement  * ka );
 
 		bool isInitiatorMessage() const;

Modified: trunk/libmikey/mikey/MikeyMessagePSK.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessagePSK.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessagePSK.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien, Joachim Orrblad
+  Copyright (C) 2006 Mikael Magnusson
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -20,6 +21,7 @@
  * Authors: Erik Eliasson <eliasson at it.kth.se>
  *          Johan Bilien <jobi at via.ecp.fr>
  *	    Joachim Orrblad <joachim at orrblad.com>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
 */
 
 
@@ -118,20 +120,20 @@
 				"Not a PSK keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
 	//uint32_t csbId;
 	MRef<MikeyCsIdMap *> csIdMap;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 	//uint8_t nCs;
 
-	if( i == NULL || 
+	if( i.isNull() || 
 		i->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 		throw MikeyExceptionMessageContent( 
 				"PSK init message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_PSK_INIT ){
 		throw MikeyExceptionMessageContent( 
 				"Expected PSK init message" );
@@ -163,52 +165,57 @@
 	remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL )
+	if( i.isNull() )
 		throw MikeyExceptionMessageContent( 
 				"PSK init message had no T payload" );
 
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT*)*i)
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}	
 
-	ka->t_received = ((MikeyPayloadT*)i)->ts();
+	ka->t_received = plT->ts();
 	
 	remove( i );
+#undef plT
 
 	addPolicyTo_ka(ka); //Is in MikeyMessage.cxx
 
 	i = extractPayload( MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
+#define plRand ((MikeyPayloadRAND*)*i)
 
 	// FIXME i can be NULL
-	ka->setRand( ((MikeyPayloadRAND *)i)->randData(),
-			((MikeyPayloadRAND *)i)->randLength() );
+	ka->setRand( plRand->randData(),
+			plRand->randLength() );
 
 	remove( i );
+#undef plRand
+
 	i = extractPayload( MIKEYPAYLOAD_ID_PAYLOAD_TYPE );
 
 	//FIXME treat the case of an ID payload
-	if( i != NULL ){
+	if( !i.isNull() ){
 		remove( i );
 	}
 
 	i = extractPayload( MIKEYPAYLOAD_KEMAC_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
 	// FIXME i can be NULL
-#define kemac ((MikeyPayloadKEMAC *)i)
+#define kemac ((MikeyPayloadKEMAC *)*i)
 	int encrAlg = kemac->encrAlg();
 	int macAlg  = kemac->macAlg();
 	ka->macAlg = macAlg;
@@ -219,7 +226,7 @@
 	unsigned int encrKeyLength = 0;
 	
 	if( !deriveTranspKeys( ka, encrKey, iv, encrKeyLength, encrAlg,
-			       macAlg, ka->t_received, errorMessage ) ){
+			       macAlg, ka->t_received, *errorMessage ) ){
 		if( encrKey != NULL )
 			delete [] encrKey;
 		if( iv != NULL )
@@ -241,13 +248,13 @@
 
 	// decrypt the TGK
 	// TODO handle parse failure.
-	MikeyPayloads* subPayloads = 
+	MRef<MikeyPayloads*> subPayloads = 
 		kemac->decodePayloads( MIKEYPAYLOAD_KEYDATA_PAYLOAD_TYPE,
 				 encrKey, encrKeyLength, iv );
-	list<MikeyPayload *>::iterator iPayload =
+	list<MRef<MikeyPayload *> >::iterator iPayload =
 		subPayloads->firstPayload();
 	MikeyPayloadKeyData *keyData =
-		dynamic_cast<MikeyPayloadKeyData*>(*iPayload);
+		dynamic_cast<MikeyPayloadKeyData*>(**iPayload);
 	// FIXME: assume only one KeyData subpayload, I don't know what
 	// to do of more keys. Ask Ericsson
 	int tgkLength = keyData->keyDataLength();
@@ -266,7 +273,7 @@
 //-----------------------------------------------------------------------------------------------//
 //-----------------------------------------------------------------------------------------------//
 
-MikeyMessage * MikeyMessagePSK::buildResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessagePSK::buildResponse( KeyAgreement * kaBase ){
 	KeyAgreementPSK* ka = dynamic_cast<KeyAgreementPSK*>(kaBase);
 
 	if( !ka ){
@@ -276,7 +283,7 @@
 	
 	if( ka->getV() || ka->getCsIdMapType() == HDR_CS_ID_MAP_TYPE_IPSEC4_ID ){
 		// Build the response message
-		MikeyMessage * result = new MikeyMessage();
+		MRef<MikeyMessage *> result = new MikeyMessage();
 		result->addPayload( 
 			new MikeyPayloadHDR( HDR_DATA_TYPE_PSK_RESP, 0, 
 			HDR_PRF_MIKEY_1, ka->csbId(),
@@ -290,19 +297,23 @@
 		result->addVPayload( ka->macAlg, ka->t_received, 
 				ka->authKey, ka->authKeyLength );
 
-		if( ka->authKey != NULL )
+		if( ka->authKey != NULL ){
 			delete [] ka->authKey;
+			ka->authKey = NULL;
+		}
 
 		return result;
 	}
 	
-	if( ka->authKey != NULL )
+	if( ka->authKey != NULL ){
 		delete [] ka->authKey;
+		ka->authKey = NULL;
+	}
 	
 	return NULL;
 }
 
-MikeyMessage* MikeyMessagePSK::parseResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage*> MikeyMessagePSK::parseResponse( KeyAgreement * kaBase ){
 	KeyAgreementPSK* ka = dynamic_cast<KeyAgreementPSK*>(kaBase);
 
 	if( !ka ){
@@ -310,20 +321,20 @@
 				"Not a PSK keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 	MRef<MikeyCsIdMap *> csIdMap;
 	uint8_t nCs;
 	
-	if( i == NULL ||
+	if( i.isNull() ||
 		i->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 
 		throw MikeyExceptionMessageContent( 
 				"PSK response message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_PSK_RESP )
 		throw MikeyExceptionMessageContent( 
 				"Expected PSK response message" );
@@ -350,20 +361,22 @@
 	remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
 	// FIXME i can be NULL
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT*)*i)
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}	
 
-	uint64_t t_received = ((MikeyPayloadT*)i)->ts();
+	uint64_t t_received = plT->ts();
+#undef plT
 
 	if( error ){
 		byte_t authKey[20];
@@ -388,15 +401,13 @@
 				"Not a PSK keyagreement" );
 	}
 
-	MikeyPayload * payload = *(lastPayload());
+	MRef<MikeyPayload *> payload = *(lastPayload());
  
 	if( ka->rand() == NULL ){
+		MRef<MikeyPayload *> pl =
+			extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 		
-		MikeyPayloadRAND * randPayload;
-		
-		randPayload = (MikeyPayloadRAND*) extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
-		
-		if( randPayload == NULL ){
+		if( pl.isNull() ){
 			ka->setAuthError(
 				"The MIKEY init has no"
 				"RAND payload."
@@ -405,6 +416,9 @@
 			return true;
 		}
 
+		MikeyPayloadRAND * randPayload;
+		randPayload = (MikeyPayloadRAND*)*pl;
+		
 		ka->setRand( randPayload->randData(), 
 			     randPayload->randLength() );
 	}

Modified: trunk/libmikey/mikey/MikeyMessagePSK.h
===================================================================
--- trunk/libmikey/mikey/MikeyMessagePSK.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessagePSK.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -38,9 +38,9 @@
 				 int encrAlg = MIKEY_ENCR_AES_CM_128, 
 				 int macAlg  = MIKEY_MAC_HMAC_SHA1_160 );
 
-		MikeyMessage * parseResponse( KeyAgreement  * ka );
+		MRef<MikeyMessage *> parseResponse( KeyAgreement  * ka );
 		void setOffer( KeyAgreement * ka );
-		MikeyMessage * buildResponse( KeyAgreement * ka );
+		MRef<MikeyMessage *> buildResponse( KeyAgreement * ka );
 		bool authenticate( KeyAgreement  * ka );
 
 		bool isInitiatorMessage() const;

Modified: trunk/libmikey/mikey/MikeyMessageRSAR.cxx
===================================================================
--- trunk/libmikey/mikey/MikeyMessageRSAR.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessageRSAR.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -94,20 +94,20 @@
 				"Not a RSAR keyagreement" );
 	}
 
-	MikeyPayload* i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload*> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
 	//uint32_t csbId;
 	MRef<MikeyCsIdMap*> csIdMap;
-	MikeyMessage* errorMessage = new MikeyMessage();
+	MRef<MikeyMessage*> errorMessage = new MikeyMessage();
 	//uint8_t nCs;
 
-	if( i == NULL || 
+	if( i.isNull() || 
 		i->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 		throw MikeyExceptionMessageContent( 
 				"RSAR init message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_RSA_R_INIT ){
 		throw MikeyExceptionMessageContent( 
 				"Expected RSAR init message" );
@@ -139,46 +139,50 @@
 	remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL )
+	if( i.isNull() )
 		throw MikeyExceptionMessageContent( 
 				"RSAR init message had no T payload" );
 
 	// FIXME i can be NULL
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT *)(*i))
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}	
 
-	ka->t_received = ((MikeyPayloadT*)i)->ts();
+	ka->t_received = plT->ts();
 	
 	remove( i );
+#undef plT
 
 	addPolicyTo_ka(ka); //Is in MikeyMessage.cxx
 
 	i = extractPayload( MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
+#define plRand ((MikeyPayloadRAND *)*i)
 	// FIXME i can be NULL
-	ka->setRand( ((MikeyPayloadRAND *)i)->randData(),
-			((MikeyPayloadRAND *)i)->randLength() );
+	ka->setRand( plRand->randData(),
+			plRand->randLength() );
 
 	remove( i );
+#undef plRand
 	i = extractPayload( MIKEYPAYLOAD_ID_PAYLOAD_TYPE );
 
 	//FIXME treat the case of an ID payload
-	if( i != NULL ){
+	if( !i.isNull() ){
 		remove( i );
 	}
 
 }
 
-MikeyMessage* MikeyMessageRSAR::buildResponse(KeyAgreement* kaBase){
+MRef<MikeyMessage*> MikeyMessageRSAR::buildResponse(KeyAgreement* kaBase){
 	KeyAgreementRSAR* ka = dynamic_cast<KeyAgreementRSAR*>(kaBase);
 
 	if( !ka ){
@@ -187,7 +191,7 @@
 	}
 	
 	// Build the response message
-	MikeyMessageRSAR * result = new MikeyMessageRSAR();
+	MRef<MikeyMessageRSAR *> result = new MikeyMessageRSAR();
 	result->addPayload( 
 			   new MikeyPayloadHDR( HDR_DATA_TYPE_RSA_R_RESP, 0, 
 						HDR_PRF_MIKEY_1, ka->csbId(),
@@ -216,10 +220,10 @@
 
 	result->addSignaturePayload( ka->certificateChain()->get_first() );
 
-	return result;
+	return *result;
 }
 
-MikeyMessage * MikeyMessageRSAR::parseResponse( KeyAgreement * kaBase ){
+MRef<MikeyMessage *> MikeyMessageRSAR::parseResponse( KeyAgreement * kaBase ){
 	KeyAgreementRSAR* ka = dynamic_cast<KeyAgreementRSAR*>(kaBase);
 
 	if( !ka ){
@@ -227,20 +231,20 @@
 				"Not a RSAR keyagreement" );
 	}
 
-	MikeyPayload * i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
+	MRef<MikeyPayload *> i = extractPayload( MIKEYPAYLOAD_HDR_PAYLOAD_TYPE );
 	bool error = false;
-	MikeyMessage * errorMessage = new MikeyMessage();
+	MRef<MikeyMessage *> errorMessage = new MikeyMessage();
 	MRef<MikeyCsIdMap *> csIdMap;
 	uint8_t nCs;
 	
-	if( i == NULL ||
+	if( i.isNull() ||
 		i->payloadType() != MIKEYPAYLOAD_HDR_PAYLOAD_TYPE ){
 
 		throw MikeyExceptionMessageContent( 
 				"RSAR response message had no HDR payload" );
 	}
 
-#define hdr ((MikeyPayloadHDR *)(i))
+#define hdr ((MikeyPayloadHDR *)(*i))
 	if( hdr->dataType() != HDR_DATA_TYPE_RSA_R_RESP )
 		throw MikeyExceptionMessageContent( 
 				"Expected RSAR response message" );
@@ -267,31 +271,33 @@
 	remove( i );
 	i = extractPayload( MIKEYPAYLOAD_T_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
 	// FIXME i can be NULL
-	if( ((MikeyPayloadT*)i)->checkOffset( MAX_TIME_OFFSET ) ){
+#define plT ((MikeyPayloadT*)*i)
+	if( plT->checkOffset( MAX_TIME_OFFSET ) ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_INVALID_TS ) );
 	}	
 
-	uint64_t t_received = ((MikeyPayloadT*)i)->ts();
+	uint64_t t_received = plT->ts();
+#undef plT
 
 	i = extractPayload( MIKEYPAYLOAD_KEMAC_PAYLOAD_TYPE );
 
-	if( i == NULL ){
+	if( i.isNull() ){
 		error = true;
 		errorMessage->addPayload( 
 			new MikeyPayloadERR( MIKEY_ERR_TYPE_UNSPEC ) );
 	}	
 
 	// FIXME handle i == NULL
-#define kemac ((MikeyPayloadKEMAC *)i)
+#define kemac ((MikeyPayloadKEMAC *)*i)
 	int encrAlg = kemac->encrAlg();
 	int macAlg  = kemac->macAlg();
 	ka->macAlg = macAlg;
@@ -303,7 +309,7 @@
 	
 	if( !deriveTranspKeys( ka, encrKey, iv, encrKeyLength,
 			      encrAlg, macAlg, t_received,
-			      errorMessage ) ){
+			      *errorMessage ) ){
 		if( encrKey != NULL )
 			delete [] encrKey;
 		if( iv != NULL )
@@ -321,7 +327,7 @@
 	}
 	
 	// decrypt the TGK
-	MikeyPayloads* subPayloads = 
+	MRef<MikeyPayloads*> subPayloads = 
 		kemac->decodePayloads( MIKEYPAYLOAD_ID_PAYLOAD_TYPE,
 				 encrKey, encrKeyLength, iv );
 	
@@ -334,8 +340,11 @@
 		iv = NULL;
 	}
 
+	MRef<MikeyPayload *> plKeyData =
+		subPayloads->extractPayload( MIKEYPAYLOAD_KEYDATA_PAYLOAD_TYPE );
+
 	MikeyPayloadKeyData *keyData =
-		dynamic_cast<MikeyPayloadKeyData*>(subPayloads->extractPayload( MIKEYPAYLOAD_KEYDATA_PAYLOAD_TYPE ));
+		dynamic_cast<MikeyPayloadKeyData*>(*plKeyData);
 
 	int tgkLength = keyData->keyDataLength();
 	byte_t * tgk = keyData->keyData();
@@ -368,16 +377,15 @@
 				"Not a RSAR keyagreement" );
 	}
 	
-	MikeyPayload * payload = *(lastPayload());
+	MRef<MikeyPayload *> payload = *(lastPayload());
 	list<MikeyPayload *>::iterator payload_i;
  
 	if( ka->rand() == NULL ){
 		
-		MikeyPayloadRAND * randPayload;
+		MRef<MikeyPayload *> pl =
+			extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
 		
-		randPayload = (MikeyPayloadRAND*) extractPayload(MIKEYPAYLOAD_RAND_PAYLOAD_TYPE );
-		
-		if( randPayload == NULL ){
+		if( pl.isNull() ){
 			ka->setAuthError(
 				"The MIKEY init has no"
 				"RAND payload."
@@ -386,6 +394,10 @@
 			return true;
 		}
 
+		MikeyPayloadRAND * randPayload;
+		
+		randPayload = (MikeyPayloadRAND*)*pl;
+		
 		ka->setRand( randPayload->randData(), 
 			     randPayload->randLength() );
 	}

Modified: trunk/libmikey/mikey/MikeyMessageRSAR.h
===================================================================
--- trunk/libmikey/mikey/MikeyMessageRSAR.h	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libmikey/mikey/MikeyMessageRSAR.h	2007-01-08 17:35:13 UTC (rev 3099)
@@ -37,9 +37,9 @@
 		MikeyMessageRSAR();
 		MikeyMessageRSAR( KeyAgreementRSAR* ka );
 
-		MikeyMessage * parseResponse( KeyAgreement  * ka );
+		MRef<MikeyMessage *> parseResponse( KeyAgreement  * ka );
 		void setOffer( KeyAgreement * ka );
-		MikeyMessage * buildResponse( KeyAgreement * ka );
+		MRef<MikeyMessage *> buildResponse( KeyAgreement * ka );
 		bool authenticate( KeyAgreement  * ka );
 
 		bool isInitiatorMessage() const;

Modified: trunk/libminisip/source/mediahandler/KeyAgreement.cxx
===================================================================
--- trunk/libminisip/source/mediahandler/KeyAgreement.cxx	2007-01-08 14:27:04 UTC (rev 3098)
+++ trunk/libminisip/source/mediahandler/KeyAgreement.cxx	2007-01-08 17:35:13 UTC (rev 3099)
@@ -59,9 +59,9 @@
 			throw MikeyException( "No MIKEY message received" );
 		else {
 			try{
-				MikeyMessage * init_mes = MikeyMessage::parse(b64Message);
+				MRef<MikeyMessage *> init_mes = MikeyMessage::parse(b64Message);
 				
-//				MikeyMessage * resp_mes = NULL;
+//				MRef<MikeyMessage *> resp_mes = NULL;
 				switch( init_mes->type() ){
 					case MIKEY_TYPE_DH_INIT:
 
@@ -198,9 +198,10 @@
 			}
 			// Message was invalid
 			catch( MikeyExceptionMessageContent &exc ){
-				MikeyMessage * error_mes;
+				MRef<MikeyMessage *> error_mes;
 				merr << "MikeyExceptionMesageContent caught: " << exc.what() << end;
-				if( ( error_mes = exc.errorMessage() ) != NULL ){
+				error_mes = exc.errorMessage();
+				if( !error_mes.isNull() ){
 					//FIXME: send the error message!
 				}
 				/*securityConfig.*/ka_type = KEY_MGMT_METHOD_NULL;
@@ -233,10 +234,10 @@
 		return "";
 	}
 	
-	MikeyMessage * responseMessage = NULL;
-	MikeyMessage * initMessage = (MikeyMessage *)ka->initiatorData();
+	MRef<MikeyMessage *> responseMessage = NULL;
+	MRef<MikeyMessage *> initMessage = ka->initiatorData();
 
-	if( initMessage == NULL ){
+	if( initMessage.isNull() ){
 		merr << "Uninitialized message, this is a bug" << end;
 		/*securityConfig.*/secured = false;
 		return "";
@@ -268,9 +269,10 @@
 	}
 	// Message was invalid
 	catch( MikeyExceptionMessageContent & exc ){
-		MikeyMessage * error_mes;
+		MRef<MikeyMessage *> error_mes;
 		merr << "MikeyExceptionMesageContent caught: " << exc.what() << end;
-		if( ( error_mes = exc.errorMessage() ) != NULL ){
+		error_mes = exc.errorMessage();
+		if( !error_mes.isNull() ){
 			responseMessage = error_mes;
 		}
 		/*securityConfig.*/ka_type = KEY_MGMT_METHOD_NULL;
@@ -282,7 +284,7 @@
 		/*securityConfig.*/secured = false;
 	}
 
-	if( responseMessage != NULL ){
+	if( !responseMessage.isNull() ){
 		//merr << "Created response message" << responseMessage->get_string() << end;
 		return responseMessage->b64Message();
 	}
@@ -296,7 +298,7 @@
 
 
 string Session::initiatorCreate(){
-	MikeyMessage * message;
+	MRef<MikeyMessage *> message;
 	
 	
 	try{
@@ -355,7 +357,6 @@
 		}
 		
 		string b64Message = message->b64Message();
-		delete message;
 		return "mikey "+b64Message;
 	}
 	catch( certificate_exception & ){
@@ -387,7 +388,7 @@
 			return false;
 		} else {
 			try{
-				MikeyMessage * resp_mes = MikeyMessage::parse( message );
+				MRef<MikeyMessage *> resp_mes = MikeyMessage::parse( message );
 				ka->setResponderData( resp_mes );
 
 				switch( /*securityConfig.*/ka_type ){
@@ -465,9 +466,10 @@
 				return false;
 			}
 			catch(MikeyExceptionMessageContent &exc){
-				MikeyMessage * error_mes;
+				MRef<MikeyMessage *> error_mes;
 				merr << "MikeyExceptionMessageContent caught: " << exc.what() << end;
-				if( ( error_mes = exc.errorMessage() ) != NULL ){
+				error_mes = exc.errorMessage();
+				if( !error_mes.isNull() ){
 					//FIXME: send the error message!
 				}
 				/*securityConfig.*/ka_type = KEY_MGMT_METHOD_NULL;
@@ -500,12 +502,12 @@
 		return "";
 	}
 	
-	MikeyMessage * responseMessage = NULL;
+	MRef<MikeyMessage *> responseMessage = NULL;
 	
 	try{
-		MikeyMessage * initMessage = (MikeyMessage *)ka->responderData();
+		MRef<MikeyMessage *> initMessage = ka->responderData();
 
-		if( initMessage == NULL ){
+		if( initMessage.isNull() ){
 			merr << "Uninitialized MIKEY init message, this is a bug" << end;
 			/*securityConfig.*/ka_type = KEY_MGMT_METHOD_NULL;
 			/*securityConfig.*/secured = false;
@@ -535,9 +537,10 @@
 	}
 	// Message was invalid
 	catch( MikeyExceptionMessageContent &exc ){
-		MikeyMessage * error_mes;
+		MRef<MikeyMessage *> error_mes;
 		merr << "MikeyExceptionMesageContent caught: " << exc.what() << end;
-		if( ( error_mes = exc.errorMessage() ) != NULL ){
+		error_mes = exc.errorMessage();
+		if( !error_mes.isNull() ){
 			responseMessage = error_mes;
 		}
 		/*securityConfig.*/ka_type = KEY_MGMT_METHOD_NULL;
@@ -549,7 +552,7 @@
 		/*securityConfig.*/secured = false;
 	}
 
-	if( responseMessage != NULL )
+	if( !responseMessage.isNull() )
 		return responseMessage->b64Message();
 	else
 		return string("");
@@ -581,7 +584,7 @@
 }
 
 void Session::setMikeyOffer(){
-	MikeyMessage * initMessage = (MikeyMessage *)ka->initiatorData();
+	MRef<MikeyMessage *> initMessage = ka->initiatorData();
 	initMessage->setOffer( *ka );
 }
 



More information about the Minisip-devel mailing list