Browse Source

Finally! The first complete and correct decode of an request for an
OpenSecureChannelService ;-)

M decodeInt16, decodeInt32: bugfix
M decodeExtensionObject: NO_BODY_IS_ENCODED = no body
M encodeExtensionObject: same
M ExtensionObject_calcSize: same
M extensionObject_calcSize: same (ups, strange...)
+ UA_ByteString_printx: dump character for character, nice for debugging
M UA_ExtensionObject: Length is already part of body, isn't it?
M SL_processMessage: some more debugging, added decoding of clientNonce

Leon Urbas 11 years ago
parent
commit
f4d28e230b
4 changed files with 707 additions and 808 deletions
  1. 420 556
      src/opcua_binaryEncDec.c
  2. 41 29
      src/opcua_builtInDatatypes.c
  3. 0 1
      src/opcua_builtInDatatypes.h
  4. 246 222
      src/opcua_secureChannelLayer.c

File diff suppressed because it is too large
+ 420 - 556
src/opcua_binaryEncDec.c


+ 41 - 29
src/opcua_builtInDatatypes.c

@@ -5,48 +5,57 @@
  *      Author: opcua
  */
 
-
 #include "opcua_builtInDatatypes.h"
 #include <stdio.h>
 
-Int32 UA_String_compare(UA_String *string1,UA_String *string2)
-{
+Int32 UA_String_compare(UA_String *string1, UA_String *string2) {
 	Int32 i;
 	Boolean equal;
 
-	if(string1->Length == string2->Length &&
-	   string1->Length > 0 &&
-	   string1->Data != NULL && string2->Data != NULL)
+	if (string1->Length == string2->Length&&
+	string1->Length > 0 &&
+	string1->Data != NULL && string2->Data != NULL) {for(i = 0; i < string1->Length; i++)
 	{
-		for(i = 0; i < string1->Length; i++)
+		if(string1->Data[i] != string2->Data[i])
 		{
-			if(string1->Data[i] != string2->Data[i])
-			{
-				return UA_NOT_EQUAL;
-			}
-
+			return UA_NOT_EQUAL;
 		}
+
 	}
-	else
-	{
-		return UA_NOT_EQUAL;
-	}
+}
+else
+{
+	return UA_NOT_EQUAL;
+}
 	return UA_EQUAL;
 }
 
-Int32 UA_ByteString_compare(UA_ByteString *string1,UA_ByteString *string2)
-{
-	return UA_String_compare((UA_String*)string1,(UA_String*)string2);
+Int32 UA_ByteString_compare(UA_ByteString *string1, UA_ByteString *string2) {
+	return UA_String_compare((UA_String*) string1, (UA_String*) string2);
 }
 
 void UA_String_printf(char* label, UA_ByteString* string) {
-	printf("%s {Length=%d, Data=%.*s}\n", label, string->Length, string->Length, (char*) string->Data);
+	printf("%s {Length=%d, Data=%.*s}\n", label, string->Length, string->Length,
+			(char*) string->Data);
+}
+
+void UA_ByteString_printx(char* label, UA_ByteString* string) {
+	int i;
+	printf("%s {Length=%d, Data=", label, string->Length);
+	if (string->Length > 0) {
+		for (i = 0; i < string->Length; i++) {
+			printf("%c%d", i == 0 ? '{' : ',', (string->Data)[i]);
+		}
+	} else {
+		printf("{");
+	}
+	printf("}}\n");
 }
 
 void UA_NodeId_printf(char* label, UA_NodeId* node) {
-	printf("%s {EncodingByte=%d, Namespace=%d, ", label, (int) node->EncodingByte, (int) node->Namespace);
-	switch (node->EncodingByte)
-	{
+	printf("%s {EncodingByte=%d, Namespace=%d, ", label,
+			(int) node->EncodingByte, (int) node->Namespace);
+	switch (node->EncodingByte) {
 	case NIEVT_TWO_BYTE:
 	case NIEVT_FOUR_BYTE:
 	case NIEVT_NUMERIC:
@@ -55,14 +64,17 @@ void UA_NodeId_printf(char* label, UA_NodeId* node) {
 	case NIEVT_STRING:
 	case NIEVT_BYTESTRING:
 		// TODO: This implementation does not distinguish between String and Bytestring. Error?
-		printf("Identifier={Length=%d, Data=%.*s}", node->Identifier.String.Length, node->Identifier.String.Length, (char*) (node->Identifier.String.Data));
+		printf("Identifier={Length=%d, Data=%.*s}",
+				node->Identifier.String.Length, node->Identifier.String.Length,
+				(char*) (node->Identifier.String.Data));
 		break;
 	case NIEVT_GUID:
-		printf("guid={Data1=%d, Data2=%d, Data3=%d, Data4=={Length=%d, Data=%.*s}}",
-				node->Identifier.Guid.Data1,
-				node->Identifier.Guid.Data2,
-				node->Identifier.Guid.Data3,
-				node->Identifier.Guid.Data4.Length, node->Identifier.Guid.Data4.Length, (char*) (node->Identifier.Guid.Data4.Data));
+		printf(
+				"Guid={Data1=%d, Data2=%d, Data3=%d, Data4=={Length=%d, Data=%.*s}}",
+				node->Identifier.Guid.Data1, node->Identifier.Guid.Data2,
+				node->Identifier.Guid.Data3, node->Identifier.Guid.Data4.Length,
+				node->Identifier.Guid.Data4.Length,
+				(char*) (node->Identifier.Guid.Data4.Data));
 		break;
 	default:
 		printf("ups! shit happens");

+ 0 - 1
src/opcua_builtInDatatypes.h

@@ -382,7 +382,6 @@ typedef struct UA_ExtensionObject
 {
 	UA_NodeId TypeId;
 	Byte Encoding; //Type of the Enum UA_ExtensionObjectEncodingMaskType
-	Int32 Length;
 	UA_ByteString Body;
 }
 UA_ExtensionObject;

+ 246 - 222
src/opcua_secureChannelLayer.c

@@ -7,7 +7,6 @@
 #include "opcua_secureChannelLayer.h"
 #include <stdio.h>
 
-
 /*
  * opens a secureChannel (server side)
  */
@@ -15,14 +14,13 @@ Int32 SL_secureChannel_open(const UA_connection *connection,
 		const AD_RawMessage *secureChannelPacket,
 		const SL_SecureConversationMessageHeader *SCMHeader,
 		const SL_AsymmetricAlgorithmSecurityHeader *AASHeader,
-		const SL_SequenceHeader *SequenceHeader)
-{
+		const SL_SequenceHeader *SequenceHeader) {
 	UA_AD_ResponseHeader responseHeader;
 	AD_RawMessage rawMessage;
 	Int32 position = 0;
 	//SL_secureChannel_ResponseHeader_get(connection,&responseHeader);
 	Int32 size = responseHeader_calcSize(&responseHeader);
-	rawMessage.message = (char*)opcua_malloc(size);
+	rawMessage.message = (char*) opcua_malloc(size);
 
 	encodeResponseHeader(&responseHeader, &position, &rawMessage);
 
@@ -31,19 +29,20 @@ Int32 SL_secureChannel_open(const UA_connection *connection,
 	return UA_NO_ERROR;
 }
 
-Int32 SL_openSecureChannel_responseMessage_get(UA_connection *connection,SL_Response *response, Int32* sizeInOut)
-{
+Int32 SL_openSecureChannel_responseMessage_get(UA_connection *connection,
+		SL_Response *response, Int32* sizeInOut) {
 
-	response->ServerNonce.Length =0; // TODO set a valid value for the Server Nonce
+	response->ServerNonce.Length = 0; // TODO set a valid value for the Server Nonce
 	response->ServerProtocolVersion = 0; //
 	response->SecurityToken.createdAt = opcua_getTime(); //
 	response->SecurityToken.revisedLifetime = 300000; //TODO set Lifetime of Security Token
-	response->SecurityToken.secureChannelId = connection->secureLayer.UInt32_secureChannelId; //TODO set a valid value for secureChannel id
+	response->SecurityToken.secureChannelId =
+			connection->secureLayer.UInt32_secureChannelId; //TODO set a valid value for secureChannel id
 	return UA_NO_ERROR;
 }
 
-Int32 SL_openSecureChannel_responseMessage_calcSize(SL_Response *response, Int32* sizeInOut)
-{
+Int32 SL_openSecureChannel_responseMessage_calcSize(SL_Response *response,
+		Int32* sizeInOut) {
 	Int32 length = 0;
 	length += sizeof(response->SecurityToken);
 	length += UAString_calcSize(response->ServerNonce);
@@ -54,115 +53,144 @@ Int32 SL_openSecureChannel_responseMessage_calcSize(SL_Response *response, Int32
 /*
  * closes a secureChannel (server side)
  */
-void SL_secureChannel_close(UA_connection *connection)
-{
+void SL_secureChannel_close(UA_connection *connection) {
 
 }
-Int32 SL_check(UA_connection *connection,UA_ByteString secureChannelPacket)
-{
+Int32 SL_check(UA_connection *connection, UA_ByteString secureChannelPacket) {
 	return UA_NO_ERROR;
 }
-Int32 SL_createSecurityToken(UA_connection *connection, Int32 lifeTime)
-{
+Int32 SL_createSecurityToken(UA_connection *connection, Int32 lifeTime) {
 	return UA_NO_ERROR;
 }
 
-
-/* 62451-6 §6.4.4, Table 34
- *
- */
-Int32 SL_processMessage(UA_connection *connection, UA_ByteString message)
-{
+Int32 SL_processMessage(UA_connection *connection, UA_ByteString message) {
 	Int32 pos = 0;
 	UA_AD_RequestHeader requestHeader;
 	UInt32 clientProtocolVersion;
-	UA_NodeId ServiceRequestType;
+	UA_NodeId serviceRequestType;
 	Int32 requestType;
 	Int32 securityMode;
 	Int32 requestedLifetime;
+	UA_ByteString clientNonce;
+
+	// Every Message starts with a NodeID which names the serviceRequestType
+	decoder_decodeBuiltInDatatype(message.Data, NODE_ID, &pos,
+			&serviceRequestType);
+	UA_NodeId_printf("SL_processMessage - serviceRequestType=",
+			&serviceRequestType);
+
+	if (serviceRequestType.EncodingByte == NIEVT_FOUR_BYTE
+			&& serviceRequestType.Identifier.Numeric == 446) {
+		/* OpenSecureChannelService, defined in 62541-6 §6.4.4, Table 34.
+		 * Note that part 6 adds ClientProtocolVersion and ServerProtocolVersion
+		 * to the definition in part 4
+		 *
+		 * Request
+		 *
+		 * 	Req-1) RequestHeader requestHeader
+		 * 	Req-2) UInt32 ClientProtocolVersion
+		 * 	Req-3) Enum SecurityTokenRequestType requestType
+		 * 	Req-4) Enum MessageSecurityMode SecurityMode
+		 *  Req-5) ByteString ClientNonce
+		 *  Req-6) Int32 RequestLifetime
+		 *
+		 * Response
+		 *
+		 * 	Res-1) ResponseHeader responseHeader
+		 * 	Res-2) UInt32 ServerProtocolVersion
+		 * 	Res-3) SecurityToken channelSecurityToken
+		 *  Res-5) ByteString ServerNonce
+		 */
+
+		UA_ByteString_printx("SL_processMessage - message=", &message);
+
+		// Req-1) RequestHeader requestHeader
+		decoder_decodeRequestHeader(message.Data, &pos, &requestHeader);
+		UA_String_printf("SL_processMessage - requestHeader.auditEntryId=",
+				&requestHeader.auditEntryId);
+		UA_NodeId_printf(
+				"SL_processMessage - requestHeader.authenticationToken=",
+				&requestHeader.authenticationToken);
+
+		// 	Req-2) UInt32 ClientProtocolVersion
+		decoder_decodeBuiltInDatatype(message.Data, UINT32, &pos,
+				&clientProtocolVersion);
+		printf("SL_processMessage - clientProtocolVersion=%d\n",clientProtocolVersion);
+
+		if (clientProtocolVersion
+				!= connection->transportLayer.remoteConf.protocolVersion) {
+			printf("SL_processMessage - error protocol version \n");
+			//TODO error protocol version
+			//TODO ERROR_Bad_ProtocolVersionUnsupported
 
-	decoder_decodeBuiltInDatatype(message.Data,NODE_ID,&pos,&ServiceRequestType);
-	UA_NodeId_printf("SL_processMessage - serviceRequestType=",&ServiceRequestType);
-
-	if(ServiceRequestType.EncodingByte == NIEVT_FOUR_BYTE)
-	{
-		if(ServiceRequestType.Identifier.Numeric == 446) // OpensecureChannelRequest
-		{
-			decoder_decodeRequestHeader(message.Data, &pos, &requestHeader);
-			UA_String_printf("SL_processMessage - requestHeader.auditEntryId=",&requestHeader.auditEntryId);
-			UA_NodeId_printf("SL_processMessage - requestHeader.authenticationToken=", &requestHeader.authenticationToken);
-
-			decoder_decodeBuiltInDatatype(message.Data,UINT32, &pos, &clientProtocolVersion);
-
-			if(clientProtocolVersion != connection->transportLayer.remoteConf.protocolVersion)
-			{
-				printf("SL_processMessage - error protocol version \n");
-				//TODO error protocol version
-				//TODO ERROR_Bad_ProtocolVersionUnsupported
+		}
 
+		// 	Req-3) SecurityTokenRequestType requestType
+		decoder_decodeBuiltInDatatype(message.Data, INT32, &pos, &requestType);
+		printf("SL_processMessage - requestType=%d\n",requestType);
+		switch (requestType) {
+		case securityToken_ISSUE:
+			if (connection->secureLayer.connectionState
+					== connectionState_ESTABLISHED) {
+				printf("SL_processMessage - multiply security token request");
+				//TODO return ERROR
+				return UA_ERROR;
 			}
-
-			//securityTokenRequestType
-			decoder_decodeBuiltInDatatype(message.Data,INT32,&pos,&requestType);
-			switch(requestType)
-			{
-			case securityToken_ISSUE:
-				if(connection->secureLayer.connectionState == connectionState_ESTABLISHED)
-				{
-					printf("SL_processMessage - multiply security token request");
-					//TODO return ERROR
-					return UA_ERROR;
-				}
-				printf("SL_processMessage - TODO: create new token for a new SecureChannel\n");
+			printf(
+					"SL_processMessage - TODO: create new token for a new SecureChannel\n");
 			//	SL_createNewToken(connection);
-				break;
-			case securityToken_RENEW:
-				if(connection->secureLayer.connectionState == connectionState_CLOSED)
-				{
-					printf("SL_processMessage - renew token request received, but no secureChannel was established before");
-					//TODO return ERROR
-					return UA_ERROR;
-				}
-				printf("TODO: create new token for an existing SecureChannel\n");
-				break;
-			}
-
-			//securityMode
-			decoder_decodeBuiltInDatatype(message.Data,INT32,&pos,&securityMode);
-			switch(securityMode)
-			{
-			case securityMode_INVALID:
-				connection->secureLayer.clientNonce.Data = NULL;
-				connection->secureLayer.clientNonce.Length = 0;
-				printf("SL_processMessage - client demands no security \n");
-				break;
-			case securityMode_SIGN:
-				//TODO check if senderCertificate and ReceiverCertificateThumbprint are present
-				break;
-
-			case securityMode_SIGNANDENCRYPT:
-				//TODO check if senderCertificate and ReceiverCertificateThumbprint are present
-				break;
+			break;
+		case securityToken_RENEW:
+			if (connection->secureLayer.connectionState
+					== connectionState_CLOSED) {
+				printf(
+						"SL_processMessage - renew token request received, but no secureChannel was established before");
+				//TODO return ERROR
+				return UA_ERROR;
 			}
-			// requestedLifetime
-			decoder_decodeBuiltInDatatype(message.Data,INT32,&pos,&requestedLifetime);
-			//TODO process requestedLifetime
+			printf("TODO: create new token for an existing SecureChannel\n");
+			break;
 		}
-		else
-		{
-			printf("SL_processMessage - unknown service request");
-			//TODO change error code
-			return UA_ERROR;
 
+		// 	Req-4) MessageSecurityMode SecurityMode
+		decoder_decodeBuiltInDatatype(message.Data, INT32, &pos, &securityMode);
+		printf("SL_processMessage - securityMode=%d\n",securityMode);
+		switch (securityMode) {
+		case securityMode_INVALID:
+			connection->secureLayer.clientNonce.Data = NULL;
+			connection->secureLayer.clientNonce.Length = 0;
+			printf("SL_processMessage - client demands no security \n");
+			break;
+		case securityMode_SIGN:
+			//TODO check if senderCertificate and ReceiverCertificateThumbprint are present
+			break;
+
+		case securityMode_SIGNANDENCRYPT:
+			//TODO check if senderCertificate and ReceiverCertificateThumbprint are present
+			break;
 		}
+
+		//  Req-5) ByteString ClientNonce
+		decoder_decodeBuiltInDatatype(message.Data, BYTE_STRING, &pos, &clientNonce);
+		UA_String_printf("SL_processMessage - clientNonce=",&clientNonce);
+
+		//  Req-6) Int32 RequestLifetime
+		decoder_decodeBuiltInDatatype(message.Data, INT32, &pos,
+				&requestedLifetime);
+		printf("SL_processMessage - requestedLifeTime=%d\n",requestedLifetime);
+		//TODO process requestedLifetime
+	} else {
+		printf("SL_processMessage - unknown service request");
+		//TODO change error code
+		return UA_ERROR;
+
 	}
 	return UA_NO_ERROR;
 }
 /*
  * receive and process data from underlying layer
  */
-void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage)
-{
+void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
 	UA_ByteString secureChannelPacket;
 	UA_ByteString message;
 	SL_SecureConversationMessageHeader SCM_Header;
@@ -177,145 +205,140 @@ void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage)
 
 	TL_receive(connection, &secureChannelPacket);
 
-	if(secureChannelPacket.Length > 0 && secureChannelPacket.Data != NULL)
-	{
-
+	if (secureChannelPacket.Length > 0 && secureChannelPacket.Data != NULL) {
 
 		printf("SL_receive - data received \n");
 		packetType = TL_getPacketType(&secureChannelPacket, &pos);
 
-		decodeSCMHeader(&secureChannelPacket,&pos,&SCM_Header);
-
-		switch(SCM_Header.MessageType)
-		{
-
-		case packetType_OPN : /* openSecureChannel Message received */
-				decodeAASHeader(&secureChannelPacket,&pos,&AAS_Header);
-				UA_String_printf("SL_receive - AAS_Header.ReceiverThumbprint=", &(AAS_Header.ReceiverThumbprint));
-				UA_String_printf("SL_receive - AAS_Header.SecurityPolicyUri=", &(AAS_Header.SecurityPolicyUri));
-				UA_String_printf("SL_receive - AAS_Header.SenderCertificate=", &(AAS_Header.SenderCertificate));
-				if(SCM_Header.SecureChannelId != 0)
-				{
-
-					iTmp = UA_ByteString_compare(&(connection->secureLayer.SenderCertificate), &(AAS_Header.SenderCertificate));
-					if(iTmp != UA_EQUAL)
-					{
-						printf("SL_receive - UA_ERROR_BadSecureChannelUnknown \n");
-						//TODO return UA_ERROR_BadSecureChannelUnknown
-					}
-
+		decodeSCMHeader(&secureChannelPacket, &pos, &SCM_Header);
+
+		switch (SCM_Header.MessageType) {
+
+		case packetType_OPN: /* openSecureChannel Message received */
+			decodeAASHeader(&secureChannelPacket, &pos, &AAS_Header);
+			UA_String_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
+					&(AAS_Header.ReceiverThumbprint));
+			UA_String_printf("SL_receive - AAS_Header.SecurityPolicyUri=",
+					&(AAS_Header.SecurityPolicyUri));
+			UA_String_printf("SL_receive - AAS_Header.SenderCertificate=",
+					&(AAS_Header.SenderCertificate));
+			if (SCM_Header.SecureChannelId != 0) {
+
+				iTmp = UA_ByteString_compare(
+						&(connection->secureLayer.SenderCertificate),
+						&(AAS_Header.SenderCertificate));
+				if (iTmp != UA_EQUAL) {
+					printf("SL_receive - UA_ERROR_BadSecureChannelUnknown \n");
+					//TODO return UA_ERROR_BadSecureChannelUnknown
 				}
 
-				decodeSequenceHeader(&secureChannelPacket,&pos,&SequenceHeader);
-				printf("SL_receive - SequenceHeader.RequestId=%d\n",SequenceHeader.RequestId);
-				printf("SL_receive - SequenceHeader.SequenceNr=%d\n",SequenceHeader.SequenceNumber);
+			}
+
+			decodeSequenceHeader(&secureChannelPacket, &pos, &SequenceHeader);
+			printf("SL_receive - SequenceHeader.RequestId=%d\n",
+					SequenceHeader.RequestId);
+			printf("SL_receive - SequenceHeader.SequenceNr=%d\n",
+					SequenceHeader.SequenceNumber);
 
-				//TODO check that the sequence number is smaller than MaxUInt32 - 1024
-				connection->secureLayer.sequenceNumber = SequenceHeader.SequenceNumber;
+			//TODO check that the sequence number is smaller than MaxUInt32 - 1024
+			connection->secureLayer.sequenceNumber =
+					SequenceHeader.SequenceNumber;
 
-				//SL_decrypt(&secureChannelPacket);
-				message.Data = &secureChannelPacket.Data[pos];
-				message.Length = secureChannelPacket.Length - pos;
+			//SL_decrypt(&secureChannelPacket);
+			message.Data = &secureChannelPacket.Data[pos];
+			message.Length = secureChannelPacket.Length - pos;
 
-				SL_processMessage(connection, message);
+			SL_processMessage(connection, message);
 
 			break;
-		case packetType_MSG : /* secure Channel Message received */
-			if(connection->secureLayer.connectionState == connectionState_ESTABLISHED)
-			{
+		case packetType_MSG: /* secure Channel Message received */
+			if (connection->secureLayer.connectionState
+					== connectionState_ESTABLISHED) {
 
-				if(SCM_Header.SecureChannelId == connection->secureLayer.UInt32_secureChannelId)
-				{
+				if (SCM_Header.SecureChannelId
+						== connection->secureLayer.UInt32_secureChannelId) {
 
-				}
-				else
-				{
+				} else {
 					//TODO generate ERROR_Bad_SecureChannelUnkown
 				}
 			}
 
 			break;
-		case packetType_CLO : /* closeSecureChannel Message received */
-			if(SL_check(connection,secureChannelPacket) == UA_NO_ERROR)
-			{
+		case packetType_CLO: /* closeSecureChannel Message received */
+			if (SL_check(connection, secureChannelPacket) == UA_NO_ERROR) {
 
 			}
 			break;
 		}
 
-
-
-	}
-	else
-	{
+	} else {
 		printf("SL_receive - no data received \n");
 	}
 	/*
-	Int32 readPosition = 0;
-
-	//get the Secure Channel Message Header
-	decodeSCMHeader(secureChannelPacket,
-			&readPosition, &SCM_Header);
-
-	//get the Secure Channel Asymmetric Algorithm Security Header
-	decodeAASHeader(secureChannelPacket,
-			&readPosition, &AAS_Header);
-
-	//get the Sequence Header
-	decodeSequenceHeader(secureChannelPacket,
-			&readPosition, &SequenceHeader);
-
-	//get Secure Channel Message
-	//SL_secureChannel_Message_get(connection, secureChannelPacket,
-//			&readPosition,serviceMessage);
-
-	if (secureChannelPacket->length > 0)
-	{
-		switch (SCM_Header.MessageType)
-		{
-		case packetType_MSG:
-			if (connection->secureLayer.connectionState
-					== connectionState_ESTABLISHED)
-			{
-
-			}
-			else //receiving message, without secure channel
-			{
-				//TODO send back Error Message
-			}
-			break;
-		case packetType_OPN:
-			//Server Handling
-	//		if (openSecureChannelHeader_check(connection, secureChannelPacket))
-	//		{
-				//check if the request is valid
-			//	SL_openSecureChannelRequest_check(connection, secureChannelPacket);
-	//		}
-	//		else
-	//		{
-	//			//TODO send back Error Message
-	//		}
-		//Client Handling
-
-		//TODO free memory for secureChannelPacket
-
-		break;
-		case packetType_CLO:
-
-
-		//TODO free memory for secureChannelPacket
-		break;
-		}
-
-	}
-*/
+	 Int32 readPosition = 0;
+
+	 //get the Secure Channel Message Header
+	 decodeSCMHeader(secureChannelPacket,
+	 &readPosition, &SCM_Header);
+
+	 //get the Secure Channel Asymmetric Algorithm Security Header
+	 decodeAASHeader(secureChannelPacket,
+	 &readPosition, &AAS_Header);
+
+	 //get the Sequence Header
+	 decodeSequenceHeader(secureChannelPacket,
+	 &readPosition, &SequenceHeader);
+
+	 //get Secure Channel Message
+	 //SL_secureChannel_Message_get(connection, secureChannelPacket,
+	 //			&readPosition,serviceMessage);
+
+	 if (secureChannelPacket->length > 0)
+	 {
+	 switch (SCM_Header.MessageType)
+	 {
+	 case packetType_MSG:
+	 if (connection->secureLayer.connectionState
+	 == connectionState_ESTABLISHED)
+	 {
+
+	 }
+	 else //receiving message, without secure channel
+	 {
+	 //TODO send back Error Message
+	 }
+	 break;
+	 case packetType_OPN:
+	 //Server Handling
+	 //		if (openSecureChannelHeader_check(connection, secureChannelPacket))
+	 //		{
+	 //check if the request is valid
+	 //	SL_openSecureChannelRequest_check(connection, secureChannelPacket);
+	 //		}
+	 //		else
+	 //		{
+	 //			//TODO send back Error Message
+	 //		}
+	 //Client Handling
+
+	 //TODO free memory for secureChannelPacket
+
+	 break;
+	 case packetType_CLO:
+
+
+	 //TODO free memory for secureChannelPacket
+	 break;
+	 }
+
+	 }
+	 */
 }
 /*
  * get the secure channel message header
  */
-Int32 decodeSCMHeader(UA_ByteString *rawMessage,Int32 *pos,
-		SL_SecureConversationMessageHeader* SC_Header)
-{
+Int32 decodeSCMHeader(UA_ByteString *rawMessage, Int32 *pos,
+		SL_SecureConversationMessageHeader* SC_Header) {
 	UInt32 err;
 	printf("decodeSCMHeader - entered \n");
 	// LU: wild guess - reset pos, we want to reread the message type again
@@ -328,12 +351,10 @@ Int32 decodeSCMHeader(UA_ByteString *rawMessage,Int32 *pos,
 	return UA_NO_ERROR;
 
 }
-Int32 encodeSCMHeader(SL_SecureConversationMessageHeader *SC_Header,
-		 Int32 *pos,AD_RawMessage *rawMessage)
-{
+Int32 encodeSCMHeader(SL_SecureConversationMessageHeader *SC_Header, Int32 *pos,
+		AD_RawMessage *rawMessage) {
 	const char *type = "ERR";
-	switch(SC_Header->MessageType)
-	{
+	switch (SC_Header->MessageType) {
 	case packetType_ACK:
 		type = "ACK";
 		break;
@@ -361,37 +382,40 @@ Int32 encodeSCMHeader(SL_SecureConversationMessageHeader *SC_Header,
 	return UA_NO_ERROR;
 }
 Int32 decodeSequenceHeader(UA_ByteString *rawMessage, Int32 *pos,
-		SL_SequenceHeader *SequenceHeader)
-{
+		SL_SequenceHeader *SequenceHeader) {
 	decodeUInt32(rawMessage->Data, pos, &(SequenceHeader->RequestId));
 	decodeUInt32(rawMessage->Data, pos, &(SequenceHeader->SequenceNumber));
 	return UA_NO_ERROR;
 }
-Int32 encodeSequenceHeader(SL_SequenceHeader *sequenceHeader,Int32 *pos,
-		AD_RawMessage *dstRawMessage)
-{
-	encodeUInt32(sequenceHeader->SequenceNumber,pos,&dstRawMessage->message[*pos]);
+Int32 encodeSequenceHeader(SL_SequenceHeader *sequenceHeader, Int32 *pos,
+		AD_RawMessage *dstRawMessage) {
+	encodeUInt32(sequenceHeader->SequenceNumber, pos,
+			&dstRawMessage->message[*pos]);
 	return UA_NO_ERROR;
 }
 /*
  * get the asymmetric algorithm security header
  */
 Int32 decodeAASHeader(UA_ByteString *rawMessage, Int32 *pos,
-	SL_AsymmetricAlgorithmSecurityHeader* AAS_Header)
-{
+		SL_AsymmetricAlgorithmSecurityHeader* AAS_Header) {
 	Int32 err = 0;
-	err += decodeUAByteString(rawMessage->Data,pos,&(AAS_Header->SecurityPolicyUri));
-	err += decodeUAByteString(rawMessage->Data,pos,&(AAS_Header->SenderCertificate));
-	err += decodeUAByteString(rawMessage->Data,pos,&(AAS_Header->ReceiverThumbprint));
+	err += decodeUAByteString(rawMessage->Data, pos,
+			&(AAS_Header->SecurityPolicyUri));
+	err += decodeUAByteString(rawMessage->Data, pos,
+			&(AAS_Header->SenderCertificate));
+	err += decodeUAByteString(rawMessage->Data, pos,
+			&(AAS_Header->ReceiverThumbprint));
 	return err;
 }
 
 Int32 encodeAASHeader(SL_AsymmetricAlgorithmSecurityHeader *AAS_Header,
-		Int32 *pos, AD_RawMessage* dstRawMessage)
-{
-	encodeUAString(AAS_Header->SecurityPolicyUri,pos,&dstRawMessage->message[*pos]);
-	encodeUAString(AAS_Header->SenderCertificate,pos,&dstRawMessage->message[*pos]);
-	encodeUAString(AAS_Header->ReceiverThumbprint,pos,&dstRawMessage->message[*pos]);
+		Int32 *pos, AD_RawMessage* dstRawMessage) {
+	encodeUAString(AAS_Header->SecurityPolicyUri, pos,
+			&dstRawMessage->message[*pos]);
+	encodeUAString(AAS_Header->SenderCertificate, pos,
+			&dstRawMessage->message[*pos]);
+	encodeUAString(AAS_Header->ReceiverThumbprint, pos,
+			&dstRawMessage->message[*pos]);
 	return UA_NO_ERROR;
 }