rtp/srtpstack/tsrc/ut_srtpstack/src/UT_CSRTPCryptoHandlerSRTP.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:27:36 +0100
branchRCL_3
changeset 44 0dcb073356a5
parent 43 b5e99d8877c7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  
*
*/




//  CLASS HEADER
#include "UT_CSRTPCryptoHandlerSRTP.h"
#include "srtppacket.h"
#include "srtppacketrtp.h"

//  EXTERNAL INCLUDES
#include <digia/eunit/eunitmacros.h>

// CONSTANTS
const TInt KRtpVersion = 2;    // Current protocol version          
const TUint KMinRtpHeaderLen( 12 );
const TUint16 KTestSeqNr17 = 17171;
const TUint16 KTestSeqNr18 = 17172;
const TUint16 KTestSeqNr17200 = 17200;
const TUint16 KTestSeqNr55536=55535;
const TUint16 KTestSeqNr65536=65535;

// 80 bit key, test 1
_LIT8(KTestPayload160Bits,  "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

// 80 bit key, test 1
_LIT8(KTestMKI128Bits2,      "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
_LIT8(KTestMKI128Bits,      "ABCDEF1234567890ABCDEF1234567890");

// 80 bit key, test 1
_LIT8(KTestAuthTag80Bits,   "CCCCCCCCCCCCCCCCCCCC");

_LIT8(KRFC3711_TestMasterKey128bits,    "E1F97A0D3E018BE0D64FA32C06DE4139");
_LIT8(KRFC3711_TestMasterSalt112bits,   "0EC675AD498AFEEBB6960B3AABE6");	
_LIT8(KRFC3711_SessionEncrKey128bits,   "C61E7A93744F39EE10734AFE3FF7A087");  
_LIT8(KRFC3711_SessionSaltKey128bits,   "30CBBC08863D8C85D49DB34A9AE1");  
_LIT8(KRFC3711_SessionAuthKey128bits,   "CEBE321F6FF7716B6FD4AB49AF256A156D38BAA4");  
_LIT8(KDecryptedPayload,                "2EDE3286C6E33E68C6BB93350620A1245EC0004F");  

_LIT8(KTestM_without_ROC,               "123456789ABCDE");  
_LIT8(KRefM_with_ROC,                   "123456789ABCDEFFFFFFFF");  

_LIT8(KTestAuthTag,                     "D07919ABC9F235CB4516");  

#define RTP_EUNIT_ASSERT_SPECIFIC_LEAVE( func, val ) \
{\
TRAPD( rtpUnitTestRetVal, func );\
if ( val != KErrNoMemory && rtpUnitTestRetVal == KErrNoMemory ){\
	User::Leave( KErrNoMemory );\
	}\
else{\
	EUNIT_ASSERT_EQUALS( rtpUnitTestRetVal, val );\
	}\
}

//  INTERNAL INCLUDES
#include "srtpcryptohandlersrtp.h"
#include "srtpmastersalt.h"
#include "srtpmasterkey.h"
#include "srtpstreamin.h"
#include "srtpstreamout.h"
#include "srtpsession.h"
#include "srtputils.h"


UT_CSRTPCryptoHandlerSRTP::TPayloadDetails::TPayloadDetails() :
        seqNr(),
//      ssrc(),
        padding(0),
        numCSRC(0),
        fHeaderExtension(EFalse),
        payloadLen(0),
        payloadData(NULL),
        MKILen(0),
        MKIData(NULL),
        authTagLen(0),
        authTagData(NULL)
            {            
            }
        

// CONSTRUCTION
UT_CSRTPCryptoHandlerSRTP* UT_CSRTPCryptoHandlerSRTP::NewL()
    {
    UT_CSRTPCryptoHandlerSRTP* self = UT_CSRTPCryptoHandlerSRTP::NewLC(); 
    CleanupStack::Pop();

    return self;
    }

UT_CSRTPCryptoHandlerSRTP* UT_CSRTPCryptoHandlerSRTP::NewLC()
    {
    UT_CSRTPCryptoHandlerSRTP* self = new( ELeave ) UT_CSRTPCryptoHandlerSRTP();
    CleanupStack::PushL( self );

	self->ConstructL(); 

    return self;
    }

// Destructor (virtual by CBase)
UT_CSRTPCryptoHandlerSRTP::~UT_CSRTPCryptoHandlerSRTP()
    {
    }

// Default constructor
UT_CSRTPCryptoHandlerSRTP::UT_CSRTPCryptoHandlerSRTP() 
    {

    }

// Second phase construct
void UT_CSRTPCryptoHandlerSRTP::ConstructL()
    {
    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
    // It generates the test case table.
    CEUnitTestSuiteClass::ConstructL();
    }

//  METHODS


void UT_CSRTPCryptoHandlerSRTP::SRTPMasterKeyStaleEvent(const CSRTPStream& /*aStream*/ )
    {
    iReKeyCalled= ETrue;
    }
void UT_CSRTPCryptoHandlerSRTP::SRTPMasterKeyStaleEvent(const CSRTPSession& /*aSession*/ )
    {
    iReKeyCalled= ETrue;
    }



void UT_CSRTPCryptoHandlerSRTP::SetupL(  )
    {    

    iDecryptedPayload = HBufC8::NewL(KDecryptedPayload().Length());
	*iDecryptedPayload = KDecryptedPayload;
	Hex(*iDecryptedPayload);

    iRFC3711_SessionEncrKey128bits = HBufC8::NewL(KRFC3711_SessionEncrKey128bits().Length());
	*iRFC3711_SessionEncrKey128bits = KRFC3711_SessionEncrKey128bits;
	Hex(*iRFC3711_SessionEncrKey128bits);

    iRFC3711_SessionSaltKey128bits = HBufC8::NewL(KRFC3711_SessionSaltKey128bits().Length());
	*iRFC3711_SessionSaltKey128bits = KRFC3711_SessionSaltKey128bits;
	Hex(*iRFC3711_SessionSaltKey128bits);

    iRFC3711_SessionAuthKey128bits = HBufC8::NewL(KRFC3711_SessionAuthKey128bits().Length());
	*iRFC3711_SessionAuthKey128bits = KRFC3711_SessionAuthKey128bits;
	Hex(*iRFC3711_SessionAuthKey128bits);
	
    
	iTestPayload160Bits = HBufC8::NewL(KTestPayload160Bits().Length());
	*iTestPayload160Bits = KTestPayload160Bits;	
	Hex(*iTestPayload160Bits);	
    
	iTestMKI128Bits = HBufC8::NewL(KTestMKI128Bits().Length());
	*iTestMKI128Bits = KTestMKI128Bits;	
	Hex(*iTestMKI128Bits);	

	iTestAuthTag80Bits = HBufC8::NewL(KTestAuthTag80Bits().Length());
	*iTestAuthTag80Bits = KTestAuthTag80Bits;	
	Hex(*iTestAuthTag80Bits);	
		
		
   HBufC8* masterKey = HBufC8::NewL(KRFC3711_TestMasterKey128bits().Length());
    CleanupStack::PushL( masterKey );
    *masterKey = KRFC3711_TestMasterKey128bits;
	
    
    
    HBufC8* masterSalt =HBufC8::NewL(KRFC3711_TestMasterSalt112bits().Length());
    CleanupStack::PushL( masterSalt);
	*masterSalt = KRFC3711_TestMasterSalt112bits;
	
	
	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	
	iMasterKey = CSRTPMasterKey::NewL( *masterKey, *mki );
    iMasterSalt = CSRTPMasterSalt::NewL( *masterSalt );
    
    
    TSrtpCryptoParams params;
    iContext = CSRTPCryptoContext::NewL(iMasterKey, iMasterSalt, params );
    CleanupStack::PopAndDestroy( mki );
    CleanupStack::PopAndDestroy( masterSalt );
    CleanupStack::PopAndDestroy( masterKey ); 
    iDestination.Input(_L("127.0.0.1"));

    iSRTPSession = CSRTPSession::NewL( iDestination, iContext, *this ); 
    iStreamIn = CSRTPStreamIn::NewL(*iSRTPSession, (TUint)1);

    iCryptoHandlerSRTP=  iStreamIn->iHandlerRTP;    
    iReKeyCalled = EFalse;
    } 



void UT_CSRTPCryptoHandlerSRTP::Teardown(  )
    {
    delete iDecryptedPayload;
    delete iTestPayload160Bits;
    delete iTestMKI128Bits;
    delete iTestAuthTag80Bits;

    delete iStreamIn;
    delete iSRTPSession;    

    
    delete iRFC3711_SessionEncrKey128bits;
    delete iRFC3711_SessionSaltKey128bits;
    delete iRFC3711_SessionAuthKey128bits;    

    }


void UT_CSRTPCryptoHandlerSRTP::Hex(HBufC8& aString)
{
    TPtr8 ptr=aString.Des();
    TInt length = aString.Length();
    if (aString.Length()%2)
        {
        ptr.SetLength(0);
        return;
        }
    TInt i;
    for (i=0;i<aString.Length();i+=2)
        {
        TUint8 tmp;
        tmp=(TUint8)(aString[i]-(aString[i]>'9'?('A'-10):'0'));
        tmp*=16;
        tmp|=(TUint8)(aString[i+1]-(aString[i+1]>'9'?('A'-10):'0'));
        ptr[i/2]=tmp;
        }
    ptr.SetLength(aString.Length()/2);

}

// ---------------------------------------------------------------------------
// UT_CSRTPCryptoHandlerSRTP::BuildSrtpPacketL()
// 
// ---------------------------------------------------------------------------
//
HBufC8* UT_CSRTPCryptoHandlerSRTP::BuildPacketL(TBool aSrtp, TPayloadDetails& details)
    {
    TUint packetSize = KMinRtpHeaderLen + details.payloadLen;
    TUint payloadStartOffset = KMinRtpHeaderLen;
    TUint8 padCount = 0;
    
    packetSize += details.numCSRC*4;
    payloadStartOffset += details.numCSRC*4;          
    
    if (details.fHeaderExtension) 
        {
        packetSize += 4;        
        payloadStartOffset += 4;
        }

    if (details.padding) 
        {
        padCount = 3;
        }
        
    packetSize += padCount;            
        
    if (aSrtp)
        {
        packetSize += details.MKILen;                    
        packetSize += details.authTagLen;                        
        }
        
    
    HBufC8* packet = HBufC8::NewMaxL(packetSize);
    TUint8* dataP = const_cast<TUint8*>( packet->Des().Ptr() );    
    TUint8* ptr = dataP;
    Mem::FillZ( ptr, packetSize);
    
    // padding (1 bit)
    ptr[0] |= static_cast<TUint8>( details.padding << 5 );
        
    // header extension (1 bit)
    if ( details.fHeaderExtension )
        {
        ptr[0] |= ( 1 << 4 );
        }
    
    if (details.numCSRC)
        {
        // CC
        ptr[0] |= details.numCSRC;
        }
       
    //sequence number
    ptr+=2;
    TSRTPUtils::Write16( ptr, details.seqNr );    
    
    //ssrc   
    /*
    ptr+=6;
    if (details.ssrc)
        {
        Mem::Copy( ptr, details.ssrc, 4 );        
        }
   */
    //payload
    ptr = dataP + payloadStartOffset;
    if (details.payloadData)
        {
        Mem::Copy( ptr, details.payloadData, details.payloadLen );        
        }

    if (aSrtp)
        {
        //MKI
        ptr = dataP + payloadStartOffset + details.payloadLen + padCount;
        if (details.MKILen > 0)
            {
            Mem::Copy( ptr, details.MKIData, details.MKILen );        
            }
    
        //auth tag
        ptr = dataP + payloadStartOffset + details.payloadLen + padCount + details.MKILen;
        if (details.authTagLen > 0)
            {
            Mem::Copy( ptr, details.authTagData, details.authTagLen );        
            }            
        }    
    
    return packet;
    }



void UT_CSRTPCryptoHandlerSRTP::UT_CSRTPCryptoHandlerSRTP_NewLL(  )
    {
    EUNIT_ASSERT( ETrue );
    }

void UT_CSRTPCryptoHandlerSRTP::UT_CSRTPCryptoHandlerSRTP_NewLCL(  )
    {
    EUNIT_ASSERT( ETrue );
    }

void UT_CSRTPCryptoHandlerSRTP::UT_InitializeEncryptedPacketLL(  )
    {
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
//        TUint8* ssrcPtr = static_cast<TUint8 *>(&ssrc);

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
//        details.ssrc        = ssrcPtr;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 0;
    details.payloadData = NULL;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
  
      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
    
    EUNIT_ASSERT( iCryptoHandlerSRTP->iCurrentPacket->PayloadLength()== 0);
   
   
    CleanupStack::PopAndDestroy(packet);  
    CleanupStack::PopAndDestroy(mki);                                   
    }



void UT_CSRTPCryptoHandlerSRTP::UT_DeriveSessionKeysL_1L(  )
    {
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
//        TUint8* ssrcPtr = static_cast<TUint8 *>(&ssrc);

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
//        details.ssrc        = ssrcPtr;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
      

      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
    
    
   
    // just a dummy packet index
    iCryptoHandlerSRTP->iPktIndex = 5;

    iCryptoHandlerSRTP->DeriveSessionKeysL();

    EUNIT_ASSERT( iCryptoHandlerSRTP->iSessionEncrKey->Compare(
                                    *iRFC3711_SessionEncrKey128bits) == 0);
    EUNIT_ASSERT( iCryptoHandlerSRTP->iSessionSaltKey->Compare(
                                    *iRFC3711_SessionSaltKey128bits) == 0);
    EUNIT_ASSERT( iCryptoHandlerSRTP->iSessionAuthKey->Compare(
                                    *iRFC3711_SessionAuthKey128bits) == 0);
   CleanupStack::PopAndDestroy(packet);  
    CleanupStack::PopAndDestroy(mki);                                   
    }


void UT_CSRTPCryptoHandlerSRTP::UT_UpdateROCL(  )
    {
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
//        TUint8* ssrcPtr = static_cast<TUint8 *>(&ssrc);

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 0;//KTestSeqNr17;
//        details.ssrc        = ssrcPtr;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
      

      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    //iCryptoHandlerSRTP->iCurrentSeq = 0;    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
     // cond. update of ROC in sender side
    iCryptoHandlerSRTP->UpdateROC();
    // ROC should not wrap when SEQ == 0 !!!
    EUNIT_ASSERT( iCryptoHandlerSRTP->ROC() == 0);
	CleanupStack::PopAndDestroy(packet);
	
	
	
    // set SEQ == 65534
    //iCryptoHandlerSRTP->iCurrentSeq = 0x10000 - 2;
    details.seqNr       = 65534;
    
    // ROC should not wrap when SEQ == 65534 !!!    
    HBufC8* packet1 = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    packetLength = packet->Length();
    //iCryptoHandlerSRTP->iCurrentSeq = 0;    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
     // cond. update of ROC in sender side
    iCryptoHandlerSRTP->UpdateROC();
    // ROC should not wrap when SEQ == 0 !!!
    EUNIT_ASSERT( iCryptoHandlerSRTP->ROC() == 0);
	CleanupStack::PopAndDestroy(packet1);


    // set SEQ == 65535
    //iCryptoHandlerSRTP->iCurrentSeq = 0x10000 - 1;
    details.seqNr       = 65535;
	HBufC8* packet2 = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    packetLength = packet->Length();
    //iCryptoHandlerSRTP->iCurrentSeq = 0;    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
     // cond. update of ROC in sender side
    iCryptoHandlerSRTP->UpdateROC();
    // ROC should be updated now, as SEQ wraps !!!    
    EUNIT_ASSERT( iCryptoHandlerSRTP->ROC() == 1);
    CleanupStack::PopAndDestroy(packet2);  
    CleanupStack::PopAndDestroy(mki);      
    }

void UT_CSRTPCryptoHandlerSRTP::CountSenderPacketIndexL(  )
    {
    iReKeyCalled= EFalse;
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
//        TUint8* ssrcPtr = static_cast<TUint8 *>(&ssrc);

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 0x10000-1;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;   
      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
    iCryptoHandlerSRTP->SetROC(0x100000000-2);
    iCryptoHandlerSRTP->CountSenderPacketIndexL();
    
    EUNIT_ASSERT( iCryptoHandlerSRTP->iReKey );
    //test Rekey
    iReKeyCalled = EFalse;
    iCryptoHandlerSRTP->SetROC( 0 );
    iCryptoHandlerSRTP->iNumPackets = 100;
    CSRTPCryptoHandlerSRTP* srtphandler = static_cast <CSRTPCryptoHandlerSRTP*> (iCryptoHandlerSRTP);
    srtphandler->iSRTPMasterKeyLifeTime = 200;

    iCryptoHandlerSRTP->ReKeyCheck();
    EUNIT_ASSERT(iReKeyCalled== ETrue);
    iCryptoHandlerSRTP->iNumPackets = 200;
    iCryptoHandlerSRTP->ReKeyCheck();
    EUNIT_ASSERT ( iCryptoHandlerSRTP->iReKey );
    
	CleanupStack::PopAndDestroy(packet);
	CleanupStack::PopAndDestroy(mki);      
    }

void UT_CSRTPCryptoHandlerSRTP::ReplayProtectionL1L(  )
    {
        //Create the packet firest 
    TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;

    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
 	iCryptoHandlerSRTP->SetReceiver_s_l();
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
             
    // derive session keys..
    iCryptoHandlerSRTP->DeriveSessionKeysL();
    // do the replay protection 
    iCryptoHandlerSRTP->ReplayProtectionL();
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
    iCryptoHandlerSRTP->AddReplayIndex();
    EUNIT_ASSERT(iCryptoHandlerSRTP->iPktIndex == KTestSeqNr17); 
   	CleanupStack::PopAndDestroy(packet);  
    
    //Create the packet again so can check the Replay protection
   	details.seqNr       = KTestSeqNr18;             
	HBufC8* packet2 = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet2);
    
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet2);
 
    iCryptoHandlerSRTP->SetReceiver_s_l();
       
    
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    iCryptoHandlerSRTP->ReplayProtectionL();
    
    
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
    iCryptoHandlerSRTP->AddReplayIndex(); 
    EUNIT_ASSERT(iCryptoHandlerSRTP->iPktIndex == KTestSeqNr18);
   	CleanupStack::PopAndDestroy(packet);  
    CleanupStack::PopAndDestroy(mki);          
    }
    
void UT_CSRTPCryptoHandlerSRTP::ReplayProtectionL2L(  )
    {
    //Set stored PktIndx number to bigger than the on in the sequence number
    //but inside the Replay window and has not been seen
    iCryptoHandlerSRTP->iPktIndex= KTestSeqNr18;
    //Create the packet firest 
    TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;

    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
 	iCryptoHandlerSRTP->SetReceiver_s_l();
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
             
    // derive session keys..
    iCryptoHandlerSRTP->DeriveSessionKeysL();
    // do the replay protection 
    iCryptoHandlerSRTP->ReplayProtectionL();
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
    iCryptoHandlerSRTP->AddReplayIndex();
    EUNIT_ASSERT(iCryptoHandlerSRTP->iPktIndex == KTestSeqNr18); 
    //check also bitmap later
   	CleanupStack::PopAndDestroy(packet); 
   	CleanupStack::PopAndDestroy(mki);         
    
    }  
    
void UT_CSRTPCryptoHandlerSRTP::ReplayProtectionL3L(  )
    {
    //Set stored PktIndx number to bigger than the on in the sequence number
    //but inside the Replay window and it has been seen
      //Create the packet firest 
    TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;

    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
 	iCryptoHandlerSRTP->SetReceiver_s_l();
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    iCryptoHandlerSRTP->DeriveSessionKeysL();
    iCryptoHandlerSRTP->ReplayProtectionL();
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
    iCryptoHandlerSRTP->AddReplayIndex();
    EUNIT_ASSERT(iCryptoHandlerSRTP->iPktIndex == KTestSeqNr17); 
   	CleanupStack::PopAndDestroy(packet);  
    
    //Create the packet again so can check the Replay protection
   	details.seqNr       = KTestSeqNr18;             
	HBufC8* packet2 = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet2);
    
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet2);
 
    iCryptoHandlerSRTP->SetReceiver_s_l();
       
    
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    iCryptoHandlerSRTP->ReplayProtectionL();
    
    
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
    iCryptoHandlerSRTP->AddReplayIndex(); 
    EUNIT_ASSERT(iCryptoHandlerSRTP->iPktIndex == KTestSeqNr18);
   	CleanupStack::PopAndDestroy(packet2);  
   	
   	//Create the packet again so can check the Replay protection
   	details.seqNr       = KTestSeqNr17;             
	HBufC8* packet3 = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet3);
    
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet3);
 
    iCryptoHandlerSRTP->SetReceiver_s_l();
       
    
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    EUNIT_ASSERT_SPECIFIC_LEAVE( 
    	iCryptoHandlerSRTP->ReplayProtectionL(), KErrArgument );
    
   	CleanupStack::PopAndDestroy(packet3);  
    CleanupStack::PopAndDestroy(mki);             
    }  
    
void UT_CSRTPCryptoHandlerSRTP::ReplayProtectionL4L(  )
    {
   //Set stored PktIndx number to bigger than the one in the sequence number
    //and outside the Replay window
     
    iCryptoHandlerSRTP->iPktIndex= KTestSeqNr65536;
    //Create the packet firest 
    TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;

    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
 	iCryptoHandlerSRTP->SetReceiver_s_l();
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
             
    // derive session keys..
    iCryptoHandlerSRTP->DeriveSessionKeysL();
    // do the replay protection 
    EUNIT_ASSERT_SPECIFIC_LEAVE( 
    	iCryptoHandlerSRTP->ReplayProtectionL(), KErrArgument );
    
    
    
   	CleanupStack::PopAndDestroy(packet); 
   	CleanupStack::PopAndDestroy(mki);      
    }      
    
void UT_CSRTPCryptoHandlerSRTP::TestPacketHeaderAndPayloadL(  )
    {
    //Create the packet first 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;

    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;

    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
      

      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
   
    details.payloadData = decryptedPayloadPtr;
 
    TPtrC8 nonDecryptedPayload =iCryptoHandlerSRTP->iCurrentPacket->HeaderAndPayload();
	TInt size = nonDecryptedPayload.Size();
	EUNIT_ASSERT(nonDecryptedPayload.Size()==32);
	
	
   	CleanupStack::PopAndDestroy(packet);  
    CleanupStack::PopAndDestroy(mki);          
    
    }    

void UT_CSRTPCryptoHandlerSRTP::TestAuthenticationL1L(  )
	{

	//create normal packets with tag
	TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
//        TUint8* ssrcPtr = static_cast<TUint8 *>(&ssrc);

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        
	//make the caculate one different from the one here
	//so it can go into different branch in the code
    authTag.Append(0xAA);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = KTestSeqNr17;
//        details.ssrc        = ssrcPtr;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;    
    
      

      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
        
    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
 	iCryptoHandlerSRTP->SetReceiver_s_l();
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
             
    // derive session keys..
    iCryptoHandlerSRTP->DeriveSessionKeysL();
    
    RTP_EUNIT_ASSERT_SPECIFIC_LEAVE(iCryptoHandlerSRTP->AuthenticateL(), KErrNotFound);
    //cover the false branch 
    	//update crypto param to NULL
	HBufC8* masterKey = HBufC8::NewL(KRFC3711_TestMasterKey128bits().Length());
    CleanupStack::PushL( masterKey );
    *masterKey = KRFC3711_TestMasterKey128bits;

    
    HBufC8* masterSalt =HBufC8::NewL(KRFC3711_TestMasterSalt112bits().Length());
    CleanupStack::PushL( masterSalt);
	*masterSalt = KRFC3711_TestMasterSalt112bits;

	
	HBufC8* mki1 =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki1);
	*mki1 = KTestMKI128Bits;
	Hex(*mki1);
	TSrtpCryptoParams params;
	//modify crypto param	
	
	params.iSrtpAuthAlg=EAuthNull;
	params.iSrtpAuthTagLen=0;
	CSRTPMasterKey* masterkey = CSRTPMasterKey::NewLC( *masterKey, *mki1 );
    CSRTPMasterSalt* mastersalt = CSRTPMasterSalt::NewLC( *masterSalt );
    CSRTPCryptoContext* context = CSRTPCryptoContext::NewL(masterkey, mastersalt, params );
    
    CleanupStack::Pop( mastersalt );
    CleanupStack::Pop( masterkey );
    CleanupStack::PopAndDestroy( mki1 );
    CleanupStack::PopAndDestroy( masterSalt );
    CleanupStack::PopAndDestroy( masterKey ); 
    CleanupStack::PushL( context );
    iStreamIn->SetCryptoInL(context);
    CleanupStack::Pop( context );
    iStreamIn->SetROC(0);
	iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
 	iCryptoHandlerSRTP->SetReceiver_s_l();
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    
	iCryptoHandlerSRTP->AuthenticateL();
	CleanupStack::Pop(packet);  
	delete packet; 
	CleanupStack::Pop(mki);  
    delete mki;               

	}

void UT_CSRTPCryptoHandlerSRTP::TestUpdate_s_l_and_RocLL()
    {
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
//        TUint8* ssrcPtr = static_cast<TUint8 *>(&ssrc);

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 0x10000-1;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;   
      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
    iCryptoHandlerSRTP->SetROC(0);
    iCryptoHandlerSRTP->iV=3;
    //Go to more branch
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
    
    //Go to more branch
    iCryptoHandlerSRTP->iV=1;
    iCryptoHandlerSRTP->Update_s_l_and_RocL();
	CleanupStack::PopAndDestroy(packet);

    CleanupStack::PopAndDestroy(mki);      
    }
    
void UT_CSRTPCryptoHandlerSRTP::TestCountReceiverPacketIndexL()
    {
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;

    
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 11;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;   
      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
    iCryptoHandlerSRTP->SetROC(0);
    iCryptoHandlerSRTP->iS_L=32800;
    //Go to more branch
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    iCryptoHandlerSRTP->iS_L=32769;
    //Go to more branch
    iCryptoHandlerSRTP->CountReceiverPacketIndexL();
    
	CleanupStack::PopAndDestroy(packet);

    CleanupStack::PopAndDestroy(mki);      
    }    
    
void UT_CSRTPCryptoHandlerSRTP::TestCheckMasterKeyIdentifierL()
    {
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits2().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits2;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 11;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;   
      
    HBufC8* packet = BuildPacketL(ETrue, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    
    iCryptoHandlerSRTP->InitializeEncryptedPacketL(*packet);
    iCryptoHandlerSRTP->SetROC(0);
    EUNIT_ASSERT_SPECIFIC_LEAVE(iCryptoHandlerSRTP->CheckMasterKeyIdentifierL(), KErrNotFound);
	CleanupStack::PopAndDestroy(packet);

    CleanupStack::PopAndDestroy(mki);      
    }    
 
void UT_CSRTPCryptoHandlerSRTP::TestCountEncryptedPacketSizeL()
    {
    HBufC8* masterKey = HBufC8::NewL(KRFC3711_TestMasterKey128bits().Length());
    CleanupStack::PushL( masterKey );
    *masterKey = KRFC3711_TestMasterKey128bits;

    
    HBufC8* masterSalt =HBufC8::NewL(KRFC3711_TestMasterSalt112bits().Length());
    CleanupStack::PushL( masterSalt);
	*masterSalt = KRFC3711_TestMasterSalt112bits;

	
	HBufC8* mki1 =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki1);
	*mki1 = KTestMKI128Bits;
	Hex(*mki1);
	TSrtpCryptoParams params;
	//modify crypto param	
	
	params.iSrtpAuthAlg=EAuthRCCm1;
	params.iSrtpAuthTagLen=112;
	params.iROCTransRate=3;
	CSRTPMasterKey* masterkey = CSRTPMasterKey::NewLC( *masterKey, *mki1 );
    CSRTPMasterSalt* mastersalt = CSRTPMasterSalt::NewLC( *masterSalt );
    CSRTPCryptoContext* context = CSRTPCryptoContext::NewL(masterkey, mastersalt, params );
    
    CleanupStack::Pop( mastersalt );
    CleanupStack::Pop( masterkey );
    CleanupStack::PopAndDestroy( mki1 );
    CleanupStack::PopAndDestroy( masterSalt );
    CleanupStack::PopAndDestroy( masterKey ); 
    CleanupStack::PushL( context );
    iStreamIn->SetCryptoInL(context);
    CleanupStack::Pop( context );
    
    //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits2().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits2;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 11;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;   
      
    HBufC8* packet = BuildPacketL(EFalse, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    
    iCryptoHandlerSRTP->InitializePlainPacketL(*packet);
    iCryptoHandlerSRTP->SetROC(0);
    //check the size
    CSRTPPacket* packet1= iCryptoHandlerSRTP->iCurrentPacket;
    CSRTPPacketRTP* packet2 = static_cast <CSRTPPacketRTP*> (packet1);
    TInt tempSize1 = packet2->CountEncryptedPacketSizeL();
    
    EUNIT_ASSERT(tempSize1== 12 /*RTP header*/ + 20 /*payload*/ + 16 /*MKI*/);
    
	CleanupStack::PopAndDestroy(packet);

    CleanupStack::PopAndDestroy(mki);      
    }    
    
void UT_CSRTPCryptoHandlerSRTP::TestCountEncryptedPacketSize2L()
    {
    //Set Alg to NULL
    //update crypto param to NULL
	HBufC8* masterKey = HBufC8::NewL(KRFC3711_TestMasterKey128bits().Length());
    CleanupStack::PushL( masterKey );
    *masterKey = KRFC3711_TestMasterKey128bits;

    
    HBufC8* masterSalt =HBufC8::NewL(KRFC3711_TestMasterSalt112bits().Length());
    CleanupStack::PushL( masterSalt);
	*masterSalt = KRFC3711_TestMasterSalt112bits;

	
	HBufC8* mki1 =HBufC8::NewL(KTestMKI128Bits().Length());
    CleanupStack::PushL( mki1);
	*mki1 = KTestMKI128Bits;
	Hex(*mki1);
	TSrtpCryptoParams params;
	//modify crypto param	
	
	params.iSrtpAuthAlg=EAuthNull;
	params.iSrtpAuthTagLen=0;
	CSRTPMasterKey* masterkey = CSRTPMasterKey::NewLC( *masterKey, *mki1 );
    CSRTPMasterSalt* mastersalt = CSRTPMasterSalt::NewLC( *masterSalt );
    CSRTPCryptoContext* context = CSRTPCryptoContext::NewL(masterkey, mastersalt, params );
    
    CleanupStack::Pop( mastersalt );
    CleanupStack::Pop( masterkey );
    CleanupStack::PopAndDestroy( mki1 );
    CleanupStack::PopAndDestroy( masterSalt );
    CleanupStack::PopAndDestroy( masterKey ); 
    CleanupStack::PushL( context );
    iStreamIn->SetCryptoInL(context);
    CleanupStack::Pop( context );
      //Create the packet firest 
     TInt authTagLenInBytes = iContext->CryptoParams().iSrtpAuthTagLen/8;
        
    TBuf8<32> payload;
    TBuf8<32> authTag;        
    TInt ssrc = 500;
    for (TInt i=0; i<20; i++)
        {
        payload.Append(0xAA);            
        }        

    authTag.Append(0x79);
    authTag.Append(0xD0);
    authTag.Append(0xAB);
    authTag.Append(0x19);
    authTag.Append(0xF2);
    authTag.Append(0xC9);
    authTag.Append(0xCB);
    authTag.Append(0x35);
    authTag.Append(0x16);
    authTag.Append(0x45);

	HBufC8* mki =HBufC8::NewL(KTestMKI128Bits2().Length());
    CleanupStack::PushL( mki);
	*mki = KTestMKI128Bits2;
	Hex(*mki);
	TInt mkiLength = mki->Length();
	
    const TUint8* payloadPtr = payload.PtrZ();
    const TUint8* mkiPtr = mki->Des().PtrZ();
    const TUint8* authTagPtr = authTag.PtrZ();
    const TUint8* decryptedPayloadPtr = iDecryptedPayload->Ptr();
    
    TPayloadDetails details;    

    details.seqNr       = 11;
    details.padding     = 0;
    details.numCSRC     = 0;
    details.fHeaderExtension = EFalse;
    details.payloadLen  = 20;
    details.payloadData = payloadPtr;
    details.MKILen      = mkiLength;
    details.MKIData     = mkiPtr;
    details.authTagLen  = authTagLenInBytes;
    details.authTagData = authTagPtr;   
      
    HBufC8* packet = BuildPacketL(EFalse, details);
    CleanupStack::PushL(packet);
    TInt packetLength = packet->Length();
    
    iCryptoHandlerSRTP->InitializePlainPacketL(*packet);
    iStreamIn->SetROC(0);
    CSRTPPacket* packet1= iCryptoHandlerSRTP->iCurrentPacket;
    CSRTPPacketRTP* packet2 = static_cast <CSRTPPacketRTP*> (packet1);
    TInt tempSize1 = packet2->CountEncryptedPacketSizeL();
	EUNIT_ASSERT(tempSize1==12+20+16);
	CleanupStack::PopAndDestroy(packet);
    CleanupStack::PopAndDestroy(mki);          
    }
    

//  TEST TABLE

EUNIT_BEGIN_TEST_TABLE( 
    UT_CSRTPCryptoHandlerSRTP,
    "CSRTPCryptoHandlerSRTP",
    "UNIT" )

EUNIT_TEST(
    "NewL - test ",
    "CSRTPCryptoHandlerSRTP",
    "NewL",
    "FUNCTIONALITY",
    SetupL, UT_CSRTPCryptoHandlerSRTP_NewLL, Teardown)

EUNIT_TEST(
    "NewLC - test ",
    "CSRTPCryptoHandlerSRTP",
    "NewLC",
    "FUNCTIONALITY",
    SetupL, UT_CSRTPCryptoHandlerSRTP_NewLCL, Teardown)




EUNIT_TEST(
    "DeriveSessionKeysL - 1 ",
    "CSRTPCryptoHandlerSRTP",
    "DeriveSessionKeysL",
    "FUNCTIONALITY",
    SetupL, UT_DeriveSessionKeysL_1L, Teardown)

EUNIT_TEST(
    "UpdateROC - 1 ",
    "CSRTPCryptoHandlerSRTP",
    "UpdateROC",
    "FUNCTIONALITY",
    SetupL, UT_UpdateROCL, Teardown)

EUNIT_TEST(
    "CountSenderPacketIndexL ",
    "CSRTPCryptoHandlerSRTP",
    "CountSenderPacketIndexL",
    "FUNCTIONALITY",
    SetupL, CountSenderPacketIndexL, Teardown)

EUNIT_TEST(
    "ReplayProtection1 ",
    "CSRTPCryptoHandlerSRTP",
    "ReplayProtection Normal",
    "FUNCTIONALITY",
    SetupL, ReplayProtectionL1L, Teardown)   
    
EUNIT_TEST(
    "ReplayProtection2 ",
    "CSRTPCryptoHandlerSRTP",
    "ReplayProtection Normal",
    "FUNCTIONALITY",
    SetupL, ReplayProtectionL2L, Teardown)    
    
 EUNIT_TEST(
    "ReplayProtection3 ",
    "CSRTPCryptoHandlerSRTP",
    "In Replay Window",
    "FUNCTIONALITY",
    SetupL, ReplayProtectionL3L, Teardown)    
    
 EUNIT_TEST(
    "ReplayProtection4",
    "CSRTPCryptoHandlerSRTP",
    "In Replay Window",
    "FUNCTIONALITY",
    SetupL, ReplayProtectionL4L, Teardown)    
    
 EUNIT_TEST(
    "PacketHeaderAndPayloadL ",
    "CSRTPCryptoHandlerSRTP",
    "TestPacketHeaderAndPayloadL for CSrtpPacket class",
    "FUNCTIONALITY",
    SetupL, TestPacketHeaderAndPayloadL, Teardown)    

EUNIT_TEST(
    "TestAuthenticationL1L",
    "CSRTPCryptoHandlerSRTP",
    "TestAuthentication gets more coverate",
    "FUNCTIONALITY",
    SetupL, TestAuthenticationL1L, Teardown)        

EUNIT_TEST(
    "Update_s_l_and_Roc",
    "CSRTPCryptoHandlerSRTP",
    "s_l_and_Roc",
    "FUNCTIONALITY",
    SetupL, TestUpdate_s_l_and_RocLL, Teardown)        

EUNIT_TEST(
    "CountReceiverPacketIndex",
    "CSRTPCryptoHandlerSRTP",
    "CountReceiverPacketIndex",
    "FUNCTIONALITY",
    SetupL, TestCountReceiverPacketIndexL, Teardown)        

EUNIT_TEST(
    "CheckMasterKeyIdentifierL",
    "CSRTPCryptoHandlerSRTP",
    "CheckMasterKeyIdentifierL",
    "FUNCTIONALITY",
    SetupL, TestCheckMasterKeyIdentifierL, Teardown)   
EUNIT_TEST(
    "CountEncryptedPacketSize",
    "CSRTPCryptoHandlerSRTP",
    "CountEncryptedPacketSize",
    "FUNCTIONALITY",
    SetupL, TestCountEncryptedPacketSizeL, Teardown)       

EUNIT_TEST(
    "CountEncryptedPktSize2",
    "CSRTPCryptoHandlerSRTP",
    "CountEncryptedPacketSize2",
    "FUNCTIONALITY",
    SetupL, TestCountEncryptedPacketSize2L, Teardown)       

EUNIT_TEST(
    "InitializeEncryptedPacket",
    "CSRTPCryptoHandlerSRTP",
    "InitializeEncryptedPacket",
    "FUNCTIONALITY",
    SetupL, UT_InitializeEncryptedPacketLL, Teardown)   

EUNIT_END_TEST_TABLE

//  END OF FILE