opcua_secureChannelLayer.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * opcua_secureChannelLayer.c
  3. *
  4. * Created on: Jan 13, 2014
  5. * Author: opcua
  6. */
  7. #include "opcua_secureChannelLayer.h"
  8. //memory calculation
  9. Int32 SL_openSecureChannelRequest_check(const UA_connection *connection, AD_RawMessage *secureChannelMessage)
  10. {
  11. return 0;
  12. }
  13. /*
  14. * respond the securechannel_open request
  15. */
  16. Int32 SL_secureChannel_ResponseHeader_form(UA_connection *connection, T_ResponseHeader *responseHeader)
  17. {
  18. responseHeader->timestamp = 0;//TODO getCurrentTime();
  19. responseHeader->requestHandle = 0;
  20. responseHeader->serviceResult = 0; // TODO insert service result code
  21. responseHeader->serviceDiagnostics.EncodingMask = 0;
  22. responseHeader->noOfStringTable = 0;
  23. responseHeader->additionalHeader.Body = 0;
  24. responseHeader->additionalHeader.Encoding = 0;
  25. responseHeader->additionalHeader.Length = 0;
  26. responseHeader->additionalHeader.TypeId.Namespace = 0;
  27. responseHeader->additionalHeader.TypeId.Identifier.Numeric = 0;
  28. responseHeader->requestHandle = 0;
  29. return 0;
  30. }
  31. /*
  32. * opens a secureChannel (server side)
  33. */
  34. Int32 SL_secureChannel_open(const UA_connection *connection,
  35. const AD_RawMessage *secureChannelMessage,
  36. const SL_SecureConversationMessageHeader *SCMHeader,
  37. const SL_AsymmetricAlgorithmSecurityHeader *AASHeader,
  38. const SL_SequenceHeader *SequenceHeader)
  39. {
  40. return 0;
  41. }
  42. Int32 SL_openSecureChannel_responseMessage_getSize(SL_Response *response, Int32* sizeInOut)
  43. {
  44. }
  45. /*
  46. * closes a secureChannel (server side)
  47. */
  48. void SL_secureChannel_close(UA_connection *connection)
  49. {
  50. }
  51. /*
  52. * receive and process data from underlying layer
  53. */
  54. void SL_receive(UA_connection *connection, AD_RawMessage *serviceMessage)
  55. {
  56. AD_RawMessage* secureChannelMessage;
  57. SL_SecureConversationMessageHeader SCM_Header;
  58. SL_AsymmetricAlgorithmSecurityHeader AAS_Header;
  59. SL_SequenceHeader SequenceHeader;
  60. //TODO Error Handling, length checking
  61. //get data from transport layer
  62. TL_receive(connection, secureChannelMessage);
  63. Int32 readPosition = 0;
  64. //get the Secure Channel Message Header
  65. SL_secureChannel_SCMHeader_get(connection,secureChannelMessage,
  66. &readPosition, &SCM_Header);
  67. //get the Secure Channel Asymmetric Algorithm Security Header
  68. SL_secureChannel_AASHeader_get(connection, secureChannelMessage,
  69. &readPosition, &AAS_Header);
  70. //get the Sequence Header
  71. SL_secureChannel_SequenceHeader_get(connection,secureChannelMessage,
  72. &readPosition,&SequenceHeader);
  73. //get Secure Channel Message
  74. SL_secureChannel_Message_get(connection, secureChannelMessage,
  75. &readPosition,serviceMessage);
  76. if (secureChannelMessage->length > 0)
  77. {
  78. switch (SCM_Header.MessageType)
  79. {
  80. case packetType_MSG:
  81. if (connection->secureLayer.connectionState
  82. == connectionState_ESTABLISHED)
  83. {
  84. }
  85. else //receiving message, without secure channel
  86. {
  87. //TODO send back Error Message
  88. }
  89. break;
  90. case packetType_OPN:
  91. //Server Handling
  92. if (openSecureChannelHeader_check(connection, secureChannelMessage))
  93. {
  94. //check if the request is valid
  95. SL_openSecureChannelRequest_check(connection, secureChannelMessage);
  96. }
  97. else
  98. {
  99. //TODO send back Error Message
  100. }
  101. //Client Handling
  102. //TODO free memory for secureChannelMessage
  103. break;
  104. case packetType_CLO:
  105. //TODO free memory for secureChannelMessage
  106. break;
  107. }
  108. }
  109. }
  110. /*
  111. * get the secure channel message header
  112. */
  113. Int32 SL_secureChannel_SCMHeader_get(UA_connection *connection,
  114. AD_RawMessage *rawMessage,Int32 *pos, SL_SecureConversationMessageHeader* SC_Header)
  115. {
  116. SC_Header->MessageType = TL_getPacketType(rawMessage);
  117. *pos += 3;//TL_MESSAGE_TYPE_LEN;
  118. SC_Header->IsFinal = rawMessage->message[*pos];
  119. SC_Header->MessageSize = decodeUInt32(rawMessage, *pos);
  120. SC_Header->SecureChannelId = decodeUInt32(rawMessage, *pos);
  121. return 0;
  122. }
  123. Int32 SL_secureChannel_SequenceHeader_get(UA_connection *connection,
  124. AD_RawMessage *rawMessage, Int32 *pos,
  125. SL_SequenceHeader *SequenceHeader)
  126. {
  127. SequenceHeader->RequestId = decodeUInt32(rawMessage->message, pos);
  128. SequenceHeader->SequenceNumber = decodeUInt32(rawMessage->message, pos);
  129. return 0;
  130. }
  131. /*
  132. * get the asymmetric algorithm security header
  133. */
  134. Int32 SL_secureChannel_AASHeader_get(UA_connection *connection,
  135. AD_RawMessage *rawMessage, Int32 *pos,
  136. SL_AsymmetricAlgorithmSecurityHeader* AAS_Header)
  137. {
  138. Int32 err = 0;
  139. err += decodeUAByteString(rawMessage->message,pos,AAS_Header->SecurityPolicyUri);
  140. err += decodeUAByteString(rawMessage->message,pos,AAS_Header->SenderCertificate);
  141. err += decodeUAByteString(rawMessage->message,pos,AAS_Header->ReceiverThumbprint);
  142. return err;
  143. }
  144. void SL_secureChannel_Footer_get()
  145. {
  146. }