networksecurity/tls/protocol/handshaketransmitevents.h
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networksecurity/tls/protocol/handshaketransmitevents.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,238 @@
+/**
+* Copyright (c) 2003-2009 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:
+* Header file containing classes for transmitted Handshake protocol messages.
+* 
+*
+*/
+
+
+
+/**
+ @file HandshakeTransmitEvents.h
+*/
+#include "tlsevent.h"
+#include "tlsconnection.h"
+#include <tlstypedef.h>
+
+#ifndef _HANDSHAKETRANSMITEVENTS_H_
+#define _HANDSHAKETRANSMITEVENTS_H_
+
+class CHandshake;
+class CHandshakeHeader;
+class CRecordComposer;
+class CHandshakeTransmit : public CTlsEvent
+/**
+ * @class This abstract class describes transmitted SSL3.0 and TLS1.0 Handshake 
+ * protocol messages (event classes). It owns the transmitted message.
+ */
+{
+public:
+   CHandshakeTransmit( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer );
+   ~CHandshakeTransmit();
+   CHandshake& Handshake();
+
+   CHandshakeHeader* HandshakeMessage() const;
+
+protected:
+   void ComposeHandshakeHeader( TInt aHistoryUpdate, ETlsHandshakeMessage aHandshakeMessage, TDesC8& aDesComposeMsg );
+
+protected:
+   CHandshakeHeader* iHandshakeMessage; // Currently processed outgoing message
+   CRecordComposer& iRecordComposer;
+};
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+/** SSL3.0/TLS1/0 TRANSMITTED MESSAGES **/
+
+enum EClientHelloStates
+{
+	ETlsGetSessionInfo,				/** Get Session information */
+	ETlsGetCiphers,					/** Get the list of proposed ciphers */
+	ETlsComposeHello				/** Compose the Hello message */
+};
+
+enum EClientCertificateStates
+{
+	ETlsGetCertInfo,				/** Get the encoded Client certificate */
+	ETlsComposeClientCert			/** Compose the Client certificate message */
+};
+
+enum EClientKeyExchangeStates
+{
+	ETlsGetKeyExchangeMsg,			/** Get the Client key exchange message data */
+	ETlsComposeKeyExchange			/** Compose the message. */
+};
+
+enum ECertificateVerifyStates
+{
+	ETlsGetSignature,				/** Get the signed info (signature). */
+	ETlsComposeCertVerify			/** Compose the Certificate Verify message */
+};
+
+enum EFinishedStates
+{
+	ETlsGetFinishedMsg,				/** Get the Finished message data */
+	ETlsComposeFinished				/** Compose the message. */
+};
+
+class CClientHello : public CHandshakeTransmit
+/**
+ * @class This class is used to process a Client Hello message (transmitted by the protocol).
+ */
+{
+public:
+   CClientHello( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer );
+   ~CClientHello();
+   
+   virtual CAsynchEvent* ProcessL( TRequestStatus& aStatus );
+private:
+   EClientHelloStates iClientHelloStates;	// Client Hello states, used to compose the message
+   TPtr8 iBody;								// Body of Client Hello message
+   RArray<TTLSCipherSuite> iCipherList; //CTlsProvider::CipherSuites returns an array rather than descriptor
+};
+
+class CClientKeyExch : public CHandshakeTransmit
+/**
+ * @class This class is used to process a Client Key Exchange message (transmitted by the protocol).
+ */
+{
+public:
+   CClientKeyExch( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer );
+   virtual CAsynchEvent* ProcessL( TRequestStatus& aStatus );
+   ~CClientKeyExch();
+   
+private:
+	EClientKeyExchangeStates iClientKeyExcStates;	// Client Key exchange states, used for message composition
+	HBufC8* iKeyExchBuf;							// Buffer for the Key exchange message
+	TPtr8 iBody;									// Body of Client Key exchange message
+
+};
+
+class CClientCertificate : public CHandshakeTransmit
+/**
+ * @class This class is used to process a Client Certificate message (transmitted by the protocol).
+ * @brief This message is used to authenticate a client.
+ */
+{
+public:
+   CClientCertificate( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer );
+   virtual CAsynchEvent* ProcessL( TRequestStatus& aStatus );
+   ~CClientCertificate();
+
+private:
+   EClientCertificateStates iClientCertStates;	// Client Certificate states, used to compose the message.
+   RPointerArray<HBufC8> iCertArray;
+};
+
+class CCertificateVerify : public CHandshakeTransmit
+/**
+ * @class This class is used to process a Client Verify message (transmitted by the protocol).
+ */
+{
+public:
+   CCertificateVerify( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer );
+   ~CCertificateVerify();
+   virtual CAsynchEvent* ProcessL( TRequestStatus& aStatus );
+
+private:
+	ECertificateVerifyStates iCertVerifyStates;	// Certificate Verify states, used to compose the message.
+	HBufC8* iSignature;
+};
+
+class CSendFinished : public CHandshakeTransmit
+/**
+ * @class This class is used to process a Finished message (transmitted by the protocol).
+ */
+{
+public:
+   CSendFinished( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer );
+   ~CSendFinished();
+   virtual CAsynchEvent* ProcessL( TRequestStatus& aStatus );
+
+private:
+	EFinishedStates iFinishedStates;	// Finished states, used to compose the message.
+	HBufC8* iFinishedMsg;				// Buffer for the Finished message
+	TPtr8 iBody;						// Body of the Finished message
+	CSHA1* iShaHashPtr;					// Copy of SHA1 hash object, used to hash the handshake messages
+	CMD5*  iMd5HashPtr;					// Copy of MD5 hash object, used to hash the handshake messages
+};
+
+// Inline methods
+
+// CHandshakeTransmit inline methods.
+inline CHandshakeTransmit::CHandshakeTransmit( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer ) :
+   CTlsEvent( &aTlsProvider, &aStateMachine ),
+   iRecordComposer( aRecordComposer )
+{
+}
+
+inline CHandshakeHeader* CHandshakeTransmit::HandshakeMessage() const
+{
+   return iHandshakeMessage;
+}
+
+inline CHandshake& CHandshakeTransmit::Handshake()
+/**
+ * This method returns a reference to a Handshake negotiation state machine.
+ */
+{
+	return (CHandshake&) *iStateMachine;
+}
+
+// CClientHello inline methods
+inline CClientHello::CClientHello( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer ) :
+   CHandshakeTransmit( aTlsProvider, aStateMachine, aRecordComposer ),
+   iClientHelloStates( ETlsGetSessionInfo ),
+   iBody( NULL, 0 )
+{
+}
+
+// CClientKeyExch inline methods
+inline CClientKeyExch::CClientKeyExch( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer ) :
+	CHandshakeTransmit( aTlsProvider, aStateMachine, aRecordComposer ),
+	iClientKeyExcStates( ETlsGetKeyExchangeMsg ),
+	iBody( NULL, 0 )
+{
+	iKeyExchBuf = NULL;
+}
+
+// CClientCertificate inline methods
+inline CClientCertificate::CClientCertificate( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer ) :
+   CHandshakeTransmit( aTlsProvider, aStateMachine, aRecordComposer ),
+   iClientCertStates( ETlsGetCertInfo )
+{
+	   
+}
+
+// CCertificateVerify inline methods
+inline CCertificateVerify::CCertificateVerify( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer ) :
+   CHandshakeTransmit( aTlsProvider, aStateMachine, aRecordComposer ),
+   iCertVerifyStates( ETlsGetSignature )
+{
+	iSignature = NULL;
+}
+
+// CSendFinished inline methods
+inline CSendFinished::CSendFinished( CTLSProvider& aTlsProvider, CStateMachine& aStateMachine, CRecordComposer& aRecordComposer ) :
+   CHandshakeTransmit( aTlsProvider, aStateMachine, aRecordComposer ),
+   iFinishedStates( ETlsGetFinishedMsg ),
+   iBody ( NULL, 0 ),
+   iShaHashPtr ( NULL ),
+   iMd5HashPtr ( NULL )	
+{
+	iFinishedMsg = NULL;
+}
+
+#endif