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