opcua_secureChannelLayer.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. /*
  2. * opcua_secureChannelLayer.c
  3. *
  4. * Created on: Jan 13, 2014
  5. * Author: opcua
  6. */
  7. #include "opcua_secureChannelLayer.h"
  8. #include <stdio.h>
  9. /*
  10. * opens a secureChannel (server side)
  11. */
  12. Int32 SL_secureChannel_open(const UA_connection *connection,
  13. const AD_RawMessage *secureChannelPacket,
  14. const SL_SecureConversationMessageHeader *SCMHeader,
  15. const SL_AsymmetricAlgorithmSecurityHeader *AASHeader,
  16. const SL_SequenceHeader *SequenceHeader)
  17. {
  18. UA_AD_ResponseHeader responseHeader;
  19. AD_RawMessage rawMessage;
  20. Int32 position = 0;
  21. //SL_secureChannel_ResponseHeader_get(connection,&responseHeader);
  22. Int32 size = responseHeader_calcSize(&responseHeader);
  23. rawMessage.message = (char*)opcua_malloc(size);
  24. encodeResponseHeader(&responseHeader, &position, &rawMessage);
  25. rawMessage.length = position;
  26. return UA_NO_ERROR;
  27. }
  28. Int32 SL_openSecureChannel_responseMessage_get(UA_connection *connection,SL_Response *response, Int32* sizeInOut)
  29. {
  30. response->ServerNonce.Length =0; // TODO set a valid value for the Server Nonce
  31. response->ServerProtocolVersion = 0; //
  32. response->SecurityToken.createdAt = opcua_getTime(); //
  33. response->SecurityToken.revisedLifetime = 300000; //TODO set Lifetime of Security Token
  34. response->SecurityToken.secureChannelId = connection->secureLayer.UInt32_secureChannelId; //TODO set a valid value for secureChannel id
  35. return UA_NO_ERROR;
  36. }
  37. Int32 SL_openSecureChannel_responseMessage_calcSize(SL_Response *response, Int32* sizeInOut)
  38. {
  39. Int32 length = 0;
  40. length += sizeof(response->SecurityToken);
  41. length += UAString_calcSize(response->ServerNonce);
  42. length += sizeof(response->ServerProtocolVersion);
  43. return length;
  44. }
  45. /*
  46. * closes a secureChannel (server side)
  47. */
  48. void SL_secureChannel_close(UA_connection *connection)
  49. {
  50. }
  51. Int32 SL_check(UA_connection *connection,UA_ByteString secureChannelPacket)
  52. {
  53. return UA_NO_ERROR;
  54. }
  55. Int32 SL_createSecurityToken(UA_connection *connection, Int32 lifeTime)
  56. {
  57. return UA_NO_ERROR;
  58. }
  59. Int32 SL_processMessage(UA_connection *connection, UA_ByteString message)
  60. {
  61. Int32 pos = 0;
  62. UA_AD_RequestHeader requestHeader;
  63. UInt32 clientProtocolVersion;
  64. UA_NodeId ServiceRequestType;
  65. Int32 requestType;
  66. Int32 securityMode;
  67. Int32 requestedLifetime;
  68. decoder_decodeBuiltInDatatype(message,NODE_ID,&pos,ServiceRequestType);
  69. if(ServiceRequestType.EncodingByte == NIEVT_FOUR_BYTE)
  70. {
  71. if(ServiceRequestType.Identifier.Numeric == 446) // OpensecureChannelRequest
  72. {
  73. decodeRequestHeader(message, &pos, requestHeader);
  74. decoder_decodeBuiltInDatatype(message.Data,UINT32, &pos, &clientProtocolVersion);
  75. if(clientProtocolVersion != connection->transportLayer.remoteConf.protocolVersion)
  76. {
  77. printf("SL_processMessage - error protocol version \n");
  78. //TODO error protocol version
  79. //TODO ERROR_Bad_ProtocolVersionUnsupported
  80. }
  81. //securityTokenRequestType
  82. decoder_decodeBuiltInDatatype(message,INT32,&pos,requestType);
  83. switch(requestType)
  84. {
  85. case securityToken_ISSUE:
  86. if(connection->secureLayer.connectionState == connectionState_ESTABLISHED)
  87. {
  88. printf("SL_processMessage - multiply security token request");
  89. //TODO return ERROR
  90. return UA_ERROR;
  91. }
  92. // SL_createNewToken(connection);
  93. break;
  94. case securityToken_RENEW:
  95. if(connection->secureLayer.connectionState == connectionState_CLOSED)
  96. {
  97. printf("SL_processMessage - renew token request received, but no secureChannel was established before");
  98. //TODO return ERROR
  99. return UA_ERROR;
  100. }
  101. break;
  102. }
  103. //securityMode
  104. decoder_decodeBuiltInDatatype(message,INT32,&pos,&securityMode);
  105. switch(securityMode)
  106. {
  107. case securityMode_INVALID:
  108. connection->secureLayer.clientNonce.Data = NULL;
  109. connection->secureLayer.clientNonce.Length = 0;
  110. printf("SL_processMessage - client demands no security \n");
  111. break;
  112. case securityMode_SIGN:
  113. //TODO check if senderCertificate and ReceiverCertificateThumbprint are present
  114. break;
  115. case securityMode_SIGNANDENCRYPT:
  116. //TODO check if senderCertificate and ReceiverCertificateThumbprint are present
  117. break;
  118. }
  119. decoder_decodeBuiltInDatatype(message,INT32,&pos,&requestedLifetime);
  120. //TODO process requestedLifetime
  121. }
  122. else
  123. {
  124. printf("SL_processMessage - unknown service request");
  125. //TODO change error code
  126. return UA_ERROR;
  127. }
  128. }
  129. return UA_NO_ERROR;
  130. }
  131. /*
  132. * receive and process data from underlying layer
  133. */
  134. void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage)
  135. {
  136. UA_ByteString secureChannelPacket;
  137. UA_ByteString message;
  138. SL_SecureConversationMessageHeader SCM_Header;
  139. SL_AsymmetricAlgorithmSecurityHeader AAS_Header;
  140. SL_SequenceHeader SequenceHeader;
  141. Int32 packetType = 0;
  142. Int32 pos = 0;
  143. Int32 iTmp;
  144. //TODO Error Handling, length checking
  145. //get data from transport layer
  146. printf("SL_receive - entered \n");
  147. TL_receive(connection, &secureChannelPacket);
  148. if(secureChannelPacket.Length > 0 && secureChannelPacket.Data != NULL)
  149. {
  150. printf("SL_receive - data received \n");
  151. packetType = TL_getPacketType(&secureChannelPacket, &pos);
  152. decodeSCMHeader(&secureChannelPacket,&pos,&SCM_Header);
  153. switch(SCM_Header.MessageType)
  154. {
  155. case packetType_OPN : /* openSecureChannel Message received */
  156. decodeAASHeader(&secureChannelPacket,&pos,&AAS_Header);
  157. if(SCM_Header.SecureChannelId != 0)
  158. {
  159. iTmp = UA_ByteString_compare(&(connection->secureLayer.SenderCertificate), &(AAS_Header.SenderCertificate));
  160. if(iTmp != UA_EQUAL)
  161. {
  162. printf("SL_receive - UA_ERROR_BadSecureChannelUnknown \n");
  163. //TODO return UA_ERROR_BadSecureChannelUnknown
  164. }
  165. }
  166. decodeSequenceHeader(&secureChannelPacket,&pos,&SequenceHeader);
  167. //TODO check that the sequence number is smaller than MaxUInt32 - 1024
  168. connection->secureLayer.sequenceNumber = SequenceHeader.SequenceNumber;
  169. //SL_decrypt(&secureChannelPacket);
  170. message.Data = secureChannelPacket.Data[pos];
  171. message.Length = secureChannelPacket.Length - pos;
  172. SL_processMessage(connection, message);
  173. break;
  174. case packetType_MSG : /* secure Channel Message received */
  175. if(connection->secureLayer.connectionState == connectionState_ESTABLISHED)
  176. {
  177. if(SCM_Header.SecureChannelId == connection->secureLayer.UInt32_secureChannelId)
  178. {
  179. }
  180. else
  181. {
  182. //TODO generate ERROR_Bad_SecureChannelUnkown
  183. }
  184. }
  185. break;
  186. case packetType_CLO : /* closeSecureChannel Message received */
  187. if(SL_check(connection,secureChannelPacket) == UA_NO_ERROR)
  188. {
  189. }
  190. break;
  191. }
  192. }
  193. else
  194. {
  195. printf("SL_receive - no data received \n");
  196. }
  197. /*
  198. Int32 readPosition = 0;
  199. //get the Secure Channel Message Header
  200. decodeSCMHeader(secureChannelPacket,
  201. &readPosition, &SCM_Header);
  202. //get the Secure Channel Asymmetric Algorithm Security Header
  203. decodeAASHeader(secureChannelPacket,
  204. &readPosition, &AAS_Header);
  205. //get the Sequence Header
  206. decodeSequenceHeader(secureChannelPacket,
  207. &readPosition, &SequenceHeader);
  208. //get Secure Channel Message
  209. //SL_secureChannel_Message_get(connection, secureChannelPacket,
  210. // &readPosition,serviceMessage);
  211. if (secureChannelPacket->length > 0)
  212. {
  213. switch (SCM_Header.MessageType)
  214. {
  215. case packetType_MSG:
  216. if (connection->secureLayer.connectionState
  217. == connectionState_ESTABLISHED)
  218. {
  219. }
  220. else //receiving message, without secure channel
  221. {
  222. //TODO send back Error Message
  223. }
  224. break;
  225. case packetType_OPN:
  226. //Server Handling
  227. // if (openSecureChannelHeader_check(connection, secureChannelPacket))
  228. // {
  229. //check if the request is valid
  230. // SL_openSecureChannelRequest_check(connection, secureChannelPacket);
  231. // }
  232. // else
  233. // {
  234. // //TODO send back Error Message
  235. // }
  236. //Client Handling
  237. //TODO free memory for secureChannelPacket
  238. break;
  239. case packetType_CLO:
  240. //TODO free memory for secureChannelPacket
  241. break;
  242. }
  243. }
  244. */
  245. }
  246. /*
  247. * get the secure channel message header
  248. */
  249. Int32 decodeSCMHeader(UA_ByteString *rawMessage,Int32 *pos,
  250. SL_SecureConversationMessageHeader* SC_Header)
  251. {
  252. printf("decodeSCMHeader - entered \n");
  253. SC_Header->MessageType = TL_getPacketType(rawMessage);
  254. *pos += 3;//TL_MESSAGE_TYPE_LEN;
  255. SC_Header->IsFinal = rawMessage->Data[*pos];
  256. SC_Header->MessageSize = decodeUInt32(rawMessage, *pos);
  257. SC_Header->SecureChannelId = decodeUInt32(rawMessage, *pos);
  258. return UA_NO_ERROR;
  259. }
  260. Int32 encodeSCMHeader(SL_SecureConversationMessageHeader *SC_Header,
  261. Int32 *pos,AD_RawMessage *rawMessage)
  262. {
  263. const char *type = "ERR";
  264. switch(SC_Header->MessageType)
  265. {
  266. case packetType_ACK:
  267. type = "ACK";
  268. break;
  269. case packetType_CLO:
  270. type = "CLO";
  271. break;
  272. case packetType_ERR:
  273. type = "ERR";
  274. break;
  275. case packetType_HEL:
  276. type = "HEL";
  277. break;
  278. case packetType_MSG:
  279. type = "MSG";
  280. break;
  281. case packetType_OPN:
  282. type = "OPN";
  283. break;
  284. default:
  285. return UA_ERROR;
  286. }
  287. memcpy(&(rawMessage->message[*pos]), &type, 3);
  288. return UA_NO_ERROR;
  289. }
  290. Int32 decodeSequenceHeader(UA_ByteString *rawMessage, Int32 *pos,
  291. SL_SequenceHeader *SequenceHeader)
  292. {
  293. SequenceHeader->RequestId = decodeUInt32(rawMessage->Data, pos);
  294. SequenceHeader->SequenceNumber = decodeUInt32(rawMessage->Data, pos);
  295. return UA_NO_ERROR;
  296. }
  297. Int32 encodeSequenceHeader(SL_SequenceHeader *sequenceHeader,Int32 *pos,
  298. AD_RawMessage *dstRawMessage)
  299. {
  300. encodeUInt32(sequenceHeader->SequenceNumber,pos,&dstRawMessage->message[*pos]);
  301. return UA_NO_ERROR;
  302. }
  303. /*
  304. * get the asymmetric algorithm security header
  305. */
  306. Int32 decodeAASHeader(UA_ByteString *rawMessage, Int32 *pos,
  307. SL_AsymmetricAlgorithmSecurityHeader* AAS_Header)
  308. {
  309. Int32 err = 0;
  310. err += decodeUAByteString(rawMessage->Data,pos,AAS_Header->SecurityPolicyUri);
  311. err += decodeUAByteString(rawMessage->Data,pos,AAS_Header->SenderCertificate);
  312. err += decodeUAByteString(rawMessage->Data,pos,AAS_Header->ReceiverThumbprint);
  313. return err;
  314. }
  315. Int32 encodeAASHeader(SL_AsymmetricAlgorithmSecurityHeader *AAS_Header,
  316. Int32 *pos, AD_RawMessage* dstRawMessage)
  317. {
  318. encodeUAString(AAS_Header->SecurityPolicyUri,pos,&dstRawMessage->message[*pos]);
  319. encodeUAString(AAS_Header->SenderCertificate,pos,&dstRawMessage->message[*pos]);
  320. encodeUAString(AAS_Header->ReceiverThumbprint,pos,&dstRawMessage->message[*pos]);
  321. return UA_NO_ERROR;
  322. }